プライマリとセカンダリの2つのコンパレータがあるとします。最初にプライマリコンパレータで、次にセカンダリでアレイをソートするにはどうすればよいですか?
各オブジェクトに名前と番号のフィールドがあるとします。
好き
Bob 1
Bob 2
Jack 1
Jack 2
新しいコンパレータを作成せずにそれは可能ですか?
プライマリとセカンダリの2つのコンパレータがあるとします。最初にプライマリコンパレータで、次にセカンダリでアレイをソートするにはどうすればよいですか?
各オブジェクトに名前と番号のフィールドがあるとします。
好き
Bob 1
Bob 2
Jack 1
Jack 2
新しいコンパレータを作成せずにそれは可能ですか?
はい、新しいコンパレータを作成せずにソートを実行できます。
一次フィールド、二次、三次などでソートするためのよく知られたトリックがあります。最初に最も重要度の低いフィールド(三次)、次に重要なフィールド(二次)、最後に最も重要なフィールド(一次)でソートします。ただし、これが機能するには、並べ替えアルゴリズムが安定している必要があります。
配列をソートする場合は、を使用しますArrays.sort()
。を並べ替える場合はList
、を使用しますCollections.sort()
。これらの方法は両方とも安定していることが保証されています。
プライマリコンパレータオブジェクトが変数primaryComp
に格納され、セカンダリオブジェクトがに格納されているとしますsecondaryComp
。次に、あなたが望むことを達成するためのいくつかのコードがあります:
Arrays.sort(mylist, secondaryComp); // This must come first!
Arrays.sort(mylist, primaryComp);
あなたのクラスが
class X {
String name;
int num;
}
その後、並べ替えは
Arrays.sort(x, new Comparator<X>() {
@Override
public int compare(X o1, X o2) {
if (o1.name.equals(o2.name)) {
return Integer.compare(o1.num, o2.num);
}
return o1.name.compareTo(o2.name);
}});
最初に2番目のコンパレータを比較し、次に最初のコンパレータを比較します。私はそれがトリックをするべきだと信じています。そのためのクラスを作成できます。
class FullName {
public String firstName;
public String secondName;
}
と呼ばれる新しい名前を作成し、BobBobbins
値を割り当ててから、最初に2番目の名前を比較し、次に最初の名前を単純に比較するとします。比較を行うための静的関数を使用できます。
public static bool compareTo ( FullName name1, FullName name2 ) {
// Algorithm here
}
静的コンパレータを使用する場合は、次のことを行う必要があります。FullName.compareTo( BobBobbins, CharlieChaplin );