2

以下のように昇順でソートするコンパレータを作成しました。これはうまく機能しています。

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

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

ありがとう!

4

5 に答える 5

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);
}
于 2012-01-06T11:38:49.183 に答える
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());
}
于 2012-01-06T11:47:26.243 に答える
1

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

java.util.List 仕様では、リストに null を含めることができ、場合によっては複数の null を含めることができると規定されています。o?.getId()Comparator は、null 要素で実行しようとするとすぐに NullPointerException で失敗します。

私が一般的に行っているのは、自分の class を作成することですimplement java.lang.Comparable。次に、Map を使用して、要素を追加するときに要素を並べ替えることができます。通常、リストを構築する必要があるため、代わりに TreeMap を構築してみませんか?

クラスを再利用していて、さまざまな方法で並べ替えたい場合は、明示的に並べ替える必要がないように、コンストラクターTreeMapで a を作成できます。Comparator

于 2012-01-06T11:54:33.947 に答える
1

getId()int を返す場合は、単純に return を使用できid1.compareTo(id2)ます。これにより、正しい結果が得られます。お役に立てれば。

于 2012-01-06T11:25:51.727 に答える
1

そうです、私も同じようなことをしています。1 つの注意点は、Apache Commons Collections の NullComparator などの nullsafe 比較ツールを使用して、コード内のこれらの null チェックをすべて破棄できることです。

http://commons.apache.org/collections/api-2.1.1/org/apache/commons/collections/comparators/NullComparator.html#compare(java.lang.Object , java.lang.Object)

于 2012-01-06T11:29:36.053 に答える