web-dev-qa-db-ja.com

順序に関係なく、2つのコレクションに同じ要素が含まれているかどうかを確認する方法はありますか?

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

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

37
Jorn

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

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

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

これはまさにあなたが望んでいることだと思います。

46
Cowan

これは3つのメソッド呼び出しと使用法です GoogleコレクションGuava ですが、おそらく次のように簡単です。

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

一時的なMultisetsの作成は無駄に見えるかもしれませんが、コレクションを効率的に比較するには、何らかの方法でそれらにインデックスを付ける必要があります。

29
finnw

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

new HashSet(c1).equals(new HashSet(c2))
3
newacct