私には、プライマリとセカンダリの2つのコンパレータがあります。プライマリコンパレータで配列をソートし、次にセカンダリで配列をソートするにはどうすればよいですか?2つのコンパレータを指定して配列をソートする?
各オブジェクトには名前と番号フィールドがあります。
Bob 1
Bob 2
Jack 1
Jack 2
同様
は、新たなコンパレータを作成せずに、それは可能ですか?
私には、プライマリとセカンダリの2つのコンパレータがあります。プライマリコンパレータで配列をソートし、次にセカンダリで配列をソートするにはどうすればよいですか?2つのコンパレータを指定して配列をソートする?
各オブジェクトには名前と番号フィールドがあります。
Bob 1
Bob 2
Jack 1
Jack 2
同様
は、新たなコンパレータを作成せずに、それは可能ですか?
です。はい、新しいcを作成せずにソートできますomparator。
プライマリフィールド、セカンダリ、ターシャリなどのソートにはwell-known trickがあります。最も重要でないフィールド(第3)、次に重要なフィールド(セカンダリ)、最後に最も重要なフィールド(プライマリ) 。しかし、ソートアルゴリズムは安定している必要があります。これは動作するにはです。
アレイをソートする場合は、Arrays.sort()
を使用してください。 List
をソートする場合はCollections.sort()
を使用してください。これらの方法はどちらも安定していることが保証されています。
プライマリコンパレータオブジェクトが変数primaryComp
に格納され、セカンダリがsecondaryComp
に格納されているとします。次に、あなたが望むものを達成するためのコードです:
Arrays.sort(mylist, secondaryComp); // This must come first!
Arrays.sort(mylist, primaryComp);
第2の比較器を最初に比較し、次いで第1の比較器を比較する。私はそのトリックを行うべきだと信じています。クラスを作成してそのようにすることができます。
class FullName {
public String firstName;
public String secondName;
}
値を割り当て、BobBobbins
と呼ばれる、新しい名前を作成して言った後、簡単なは第一、第二名を比較し、最初の名前。あなたが比較行うための静的関数持つことができます。
public static bool compareTo (FullName name1, FullName name2) {
// Algorithm here
}
あなたは、静的なコンパレータを使用すべきを、あなたはこれを行う必要がありますすることができます:あなたのクラスは、その後
class X {
String name;
int num;
}
であると仮定しFullName.compareTo(BobBobbins, CharlieChaplin);
ソートは
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);
}});
ニース。私はそのトリックについて知らなかった! – Jack