43

Arrays.equals(a1, a2)のように動作するが、要素の順序を無視するメソッドを探していました。Google Collections (のようなものですIterables.elementsEqual()が、それは順序を説明します) と JUnit (assertEquals()明らかにequals()Collection の実装に依存する Collection を呼び出すだけで、それは私が望むものではありません) のどちらでも見つけることができませんでした。そのようなメソッドが s を取るなら最高ですがIterable、単純にCollections を取ることも問題ありません。そのようなメソッドはもちろん、コレクション内の重複要素を考慮します (したがって、単純に をテストすることはできませんcontainsAll())。

そのようなことを実装する方法を尋ねているわけではないことに注意してください.標準のコレクションライブラリのいずれかにそれがあるかどうか疑問に思っていました.

4

3 に答える 3

50

Apache commons-collections にはCollectionUtils#isEqualCollectionがあります:

指定されたコレクションに、まったく同じカーディナリティを持つまったく同じ要素が含まれている場合、true を返します。

つまり、a または b の各要素 e について、a の e のカーディナリティが b の e のカーディナリティと等しい場合です。

それは、まさにあなたが求めているものだと思います。

于 2009-10-16T09:51:44.457 に答える
29

これは 3 つのメソッド呼び出しであり、Google Collections Guavaを使用しますが、可能な限り単純です。

HashMultiset.create(c1).equals(HashMultiset.create(c2));

一時的な を作成するMultisetのは無駄に思えるかもしれませんが、コレクションを効率的に比較するには、どうにかしてインデックスを作成する必要があります。

于 2009-10-14T09:43:58.307 に答える
3

順序を無視したい場合は、セットが等しいかどうかをテストするのはどうですか?

new HashSet(c1).equals(new HashSet(c2))
于 2009-10-14T09:43:22.060 に答える