2013-03-06 11 views
7

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

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

Bob 1 
Bob 2 
Jack 1 
Jack 2 

同様

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

答えて

7

です。はい、新しい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); 
+0

ニース。私はそのトリックについて知らなかった! – Jack

-1

第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);

6

ソートは

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); 
     }}); 
関連する問題