43

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

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

4

3 回答 3

50

Apache commons-collections 有CollectionUtils#isEqualCollection

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

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

我认为,这正是您所追求的。

于 2009-10-16T09:51:44.457 回答
29

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

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

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

于 2009-10-14T09:43:58.307 回答
3

如果你想忽略顺序,那么测试集是否相等呢?

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