1が実装するクラス使用するプロジェクトでComparator
のインターフェイスを、いくつかの同等のオブジェクト間で比較するために、私は私が実装したクラス設計できることに気付きましたComparator<>
インタフェースのフィールドを持つが、その後、機能と比較するために、クラスのフィールドを使用します機能ロジック。Override
compare(...)
私はこのようなソート機能の何かを呼び出す必要がありますので。
Collections.sort(someArrayList, new SortClass(argument1, argument2));
私の質問は以下のとおりです。
このようなものをどのように共通しているのですか?
それは良いデザインと考えていますか?
それはそのことについては、よりよい解決策として考えられるであろう(指定したパラメータを用いて)新しいラッパークラスを構築し、私はいくつかのオブジェクト間の比較のロジックを変更する必要があり、ユーザー入力を取得すると仮定すると?
要求された私のSortClassは(私は上記のセクションでそれを一般化したが、ここで私の本当のソートクラスである)です。
public class SortHouses implements Comparator<Hotel> {
/** if house1 should be before house2 */
private static final int GT = -1;
/** if house1 should be after house2 */
private static final int LT = 1;
private double latitude;
private double longitude;
public SortHouses(double latitude, double longitude){
this.latitude = latitude;
this.longitude = longitude;
}
@Override
public int compare(House house1, House house2) {
double distHouse1 = Math.sqrt((Math.pow((house1.getLatitude() - latitude), 2) +
Math.pow((house1.getLongitude() - longitude), 2)));
double distHouse2 = Math.sqrt((Math.pow((house2.getLatitude() - latitude), 2) +
Math.pow((house2.getLongitude() - longitude), 2)));
if (distHouse1 < distHouse2){
return GT;
}
if (distHose1 > distHouse2) {
return LT;
}
if (house1.getNum() > house2.getNum()){
return GT;
}
return LT;
}
}
どのように一般的なのは、このような何かをされてやって?
Aは、コンパレータをパラメータ化?非常に一般的ではありません。通常のものは、自分の性質に関してソートされています。
それは良いデザインと考えていますか?
はい、あなたが基準位置までの距離によって場所をソートしたい場合は、パラメータ化コンパレータを使用することでこれを実現するための良い方法のように思えます。
しかし、私は好きではない一つのことを見ることができます。あなたはSortHotelsByProximity
、実際に引き分けの場合のPOI(興味のポイント?)との「秘密」の比較を行っています。
あなたは第2のコンパレータにこのロジックを移動した場合には、より明確に、そして後であなたに多くの柔軟性を与えるだろう:SortHotelsByPOI
。あなたはこの方法で描画用のアカウントに一緒にコンパレータを組み合わせることができthenComparing
、このようになります:
hotels.sort(new SortHotelsByProximity().thenComparing(new SortHotelsByPOI()))
そのことについては、よりよい解決策として考えられるであろう(指定したパラメータを用いて)新しいラッパークラスを構築し、私はいくつかのオブジェクト間の比較のロジックを変更する必要があり、ユーザー入力を取得すると仮定すると?
それはあなたが求めているものだ場合、私は、あなたが「ラッパークラス」によって何を意味するか知っているが、動的にユーザの入力に基づいて、コンパレータを構築することは問題ありません。