有没有办法检查两个集合是否包含相同的元素,与订单无关?

时间:2009-10-14 09:31:46

标签: java collections equals

我一直在寻找一种像Arrays.equals(a1, a2)一样操作但忽略元素顺序的方法。我无法在任何Google集合中找到它(类似于Iterables.elementsEqual(),但确实考虑了排序)和JUnit(assertEquals()显然只是在集合上调用equals()取决于Collection实现,这不是我想要的) 如果这样的方法需要Iterable s,那将是最好的,但我也可以简单地使用Collection s 这样的方法当然会考虑集合中的任何重复元素(因此它不能简单地测试containsAll())。

请注意,我不是在问如何实现这样的事情,我只是想知道是否有任何标准的Collections库都有它。

3 个答案:

答案 0 :(得分:42)

Apache commons-collections有CollectionUtils#isEqualCollection

  

如果给定的集合包含具有完全相同基数的完全相同的元素,则返回true。

     

也就是说,如果a中的e的基数等于b中e的基数,则对于a或b中的每个元素e。

我认为,这正是你所追求的目标。

答案 1 :(得分:29)

这是三个方法调用并使用 Google Collections Guava,但可能很简单:

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

创建临时Multiset可能看起来很浪费,但为了有效地比较集合,您需要以某种方式对它们进行索引。

答案 2 :(得分:3)

如果你想忽略秩序,那么如何测试集合是否相等?

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