8

プライマリとセカンダリの2つのコンパレータがあるとします。最初にプライマリコンパレータで、次にセカンダリでアレイをソートするにはどうすればよいですか?

各オブジェクトに名前と番号のフィールドがあるとします。

好き

Bob 1
Bob 2
Jack 1
Jack 2

新しいコンパレータを作成せずにそれは可能ですか?

4

3 に答える 3

12

はい、新しいコンパレータを作成せずにソートを実行できます。

一次フィールド、二次、三次などでソートするためのよく知られたトリックがあります。最初に最も重要度の低いフィールド(三次)、次に重要なフィールド(二次)、最後に最も重要なフィールド(一次)でソートします。ただし、これが機能するには、並べ替えアルゴリズムが安定している必要があります。

配列をソートする場合は、を使用しますArrays.sort()。を並べ替える場合はList、を使用しますCollections.sort()。これらの方法は両方とも安定していることが保証されています。

プライマリコンパレータオブジェクトが変数primaryCompに格納され、セカンダリオブジェクトがに格納されているとしますsecondaryComp。次に、あなたが望むことを達成するためのいくつかのコードがあります:

Arrays.sort(mylist, secondaryComp);  // This must come first!
Arrays.sort(mylist, primaryComp);
于 2013-03-06T06:49:20.740 に答える
7

あなたのクラスが

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);
        }});
于 2013-03-06T06:43:52.683 に答える
-1

最初に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 );

于 2013-03-06T06:41:20.290 に答える