1

Javaは、2つのコレクションがJavaでまったく同じであるとすばやく比較する方法を教えてください。

例えば:

このコレクションがSetの場合、それらに同じオブジェクトが含まれていて、サイズが同じであることを比較します。

コードは次のようになります

public boolean isSameSets(Set<T> set1, Set<T> set2){

    if (set1.size() != set2.size()) {
        return false;
    }

    return set1.containAll(set2) && set2.containAll(set1);
}

しかし、コレクションがリストの場合、リストは並べ替えられたコレクションであるため、すべての要素を繰り返し比較できます。この方法は最善ではないと思います。すばやく比較する方法を教えてください。

================================================== ======

皆さんに感謝します。実際、Collection equalsメソッドは、SetとListを含めてそれを実行できます。

4

4 に答える 4

4

Collectionequals(Object)メソッドはこれを自動的に行う必要があります。javadocは、コレクションの「等しい」の意味を正確に説明しており、コレクションを拡張するインターフェースのセマンティクスはさらに洗練されています。

さまざまなコレクションクラスには、それぞれのセマンティックモデルと表現に合わせて調整された、このメソッドの独自の実装があります。したがって、たとえば、equalsaのメソッドListは要素の順序を考慮しますが、equalsaのメソッドSetは通常は考慮しません。

誰かが尋ねます:

containsAll(Collection)を使用できません。

一般的に、いいえ。たとえば、同じ要素を持つ2つのリストは必ずしも等しいとは限りません。リストの順序も考慮する必要があります。(さらに、containsAllリストの比較に使用することは、最悪の場合、 aO(N^2)の効率的なequals実装がList必要な場所です。)O(N)

同じことが。の使用にも当てはまりますretainsAll

于 2012-09-29T01:37:37.273 に答える
4

このHashSet.equalsメソッドは、各セットにまったく同じ要素があることを確認するために、すでに比較を行っています。ArrayList.equals順序もチェックすることを除いて、同じことを行います。

于 2012-09-29T01:38:41.853 に答える
0

Collection.retainAll()を使用できます

于 2012-09-29T01:36:51.350 に答える
0

Google Guava ライブラリの使用も検討してください。

elementsEqual(Iterable, Iterable)    

iterables が同じ要素を同じ順序で持っている場合、true を返します。コレクションが順序が事前に定義されていない HashSet であっても、要素の数が同じで要素が等しい場合でも、正しいメソッドhashCodeequalsメソッドがあれば、反復中に両方のセットの順序が同じであることがわかります。

于 2013-11-16T09:32:16.220 に答える