2012-01-06 3 views
2

以下のように昇順でソートするコンパレータを作成しました。これはうまくいきます。Javaでコンパレータの比較メソッドを実装する最良の方法は?

Collections.sort(resultList,new Comparator<MyModelClass>() { 
      @Override 
      public int compare(MyModelClass o1, MyModelClass o2) { 
       Integer id1= o1.getId(); 
       Integer id2= o2.getId(); 
       if(id1 == null && id2 == null) { 
        return 0;    
       }else if(id1 != null && id2 == null) { 
        return -1; 
       } else if (id1 == null && id2 != null) { 
        return 1; 
       } else {     
        return id1.compareTo(id2); 
       } 
      } 
     }); 

このように実装するとよいですか?私を助けてください?

ありがとうございます!

答えて

5

それは読みやすくするためによさそうです、しかし、わずかに、より効率的な方法は次のようになります。

public int compare(MyModelClass o1, MyModelClass o2) { 
    Integer id1= o1.getId(); 
    Integer id2= o2.getId(); 
    if (id1 == null) { 
     return id2 == null ? 0 : 1; 
    } 
    if (id2 == null) { 
     return -1; 
    } 
    return id1.compareTo(id2); 
} 

かさえ:

public int compare(MyModelClass o1, MyModelClass o2) { 
    Integer id1= o1.getId(); 
    Integer id2= o2.getId(); 
    if (id1 == null) { 
     return id2 == null ? 0 : 1; 
    } 

    return id2 == null ? -1 : id1.compareTo(id2); 
} 
+0

ご返信ありがとうございます。降順で単純に逆にする必要がありますか?返信してください。 – user1016403

+0

はい、id2をid1に変更するだけです。 – Per

+0

David Newcombが指摘しているように、リストにはnull値のリスクがありますが、それは私の心を逃れました。彼の助言も考慮してください。 – Per

1

getId()がintを返す場合は、単に返品id1.compareTo(id2)とすると、正しい結果が得られます。お役に立てれば。

1

はい、私は同じことをしています。一つの発言あなたのコード内のすべてのこれらのヌルcheckingsを捨てるために、このようなApacheのコモンズコレクションのNullComparatorようにnullsafe比較ツールを使用することができることを次のようになります。

http://commons.apache.org/collections/api-2.1.1/org/apache/commons/collections/comparators/NullComparator.html#compare(java.lang.Object、java.lang.Object)メソッド

3

あなたはヌル・安全な比較が必要な場合いくつかの比較器内のロジックその後、私はこのようなユーティリティクラスの静的ヘルパーを使用することをお勧めします:

public static int compare(Comparable c1, Comparable c2) { 
    return c1 == null 
       ? (c2 == null ? 0 : 1) 
       : (c2 == null ? -1 : c1.compareTo(c2)); 
} 

コンパレータは、その後に簡素化することができます。

public int compare(MyModelClass o1, MyModelClass o2) { 
    return CompareHelper.compare(o1.getId(), o2.getId()); 
} 
1

いいえ、それは良い実装ではありません。

java.util.List仕様では、リストにnullを設定でき、場合によっては複数のNULLを設定できることが示されています。 null要素に対してo?.getId()を実行しようとするとすぐに、コンパレータはNullPointerExceptionで失敗します。

一般的には、私のクラスをimplement java.lang.Comparableにすると、Mapを使って要素を並べ替えることができます。 1つは一般的にリストを作成する必要があります。代わりにTreeMapをビルドしないのはなぜですか?

クラスを再利用していて、別の方法で並べ替える場合は、ComparatorTreeMapをコンストラクタに作成して、明示的に並べ替える必要がないようにします。

関連する問題