Java 有没有办法检查两个集合是否包含相同的元素,而不受顺序的影响?

Java 有没有办法检查两个集合是否包含相同的元素,而不受顺序的影响?,java,collections,equals,Java,Collections,Equals,我一直在寻找一种类似于array.equals(a1,a2)但忽略元素顺序的方法。我在Google集合(类似于Iterables.elementsEqual(),但这确实说明了排序)和JUnit(assertEquals()显然只是调用集合上的equals(),这取决于集合的实现,而这不是我想要的) 如果这样的方法需要Iterables,那将是最好的,但我也可以简单地使用Collections 这种方法当然会考虑集合中的任何重复元素(因此它不能简单地测试containsAll()) 请注意,我不

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


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

如果您想忽略顺序,那么测试集合的相等性如何

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

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

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

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

Apache commons collections有:

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

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


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

这不起作用,因为它会丢弃重复的元素。此外,我还必须创建两个新的哈希集。我宁愿避免为此创建新对象。如果您不关心重复项,这是可以的,例如c1=数组。asList(1,1,2),c2=数组。根据此表达式,asList(1,2,2)将是相等的。是的,但我关心重复项(正如现在的问题所述),这似乎是最有效的(也是最简单的)到目前为止,我已经看到了解决方案。我并不是说这是我要求的解决方案,但我还没有看到一个答案可以为我提供一个方法调用来实现这一点。@Jorn:如果你想要答案“是”,那么你就不会明白了:-)Jorn:你想首先这样做的事实是一个强烈的信号,你想首先将这些集合中的一个或两个表示为多集。如果你不关心它们的顺序,它们在逻辑上就不可能是列表。如果两个都表示为多集,那么猜猜看是什么?您已经获得了单方法调用解决方案!查看@Cowan答案中的CollectionUtils.isEqualCollection源代码,您会发现这正是它的实现方式,但isEqualCollection更具表现力,因此得到了我的投票。当然,如果您不使用commons collections,但使用的是Guava,那么这可能是一个更好的选择。如果您不想使用Apache(或者您不能),您可以始终执行以下操作:collection1.containsAll(collection2)和&collection2.containsAll(collection1)@ChrisGonzales,当心这个解决方案——对于以下两个集合,它将返回true:collection1=[1,blah,1,4],collection2=[1,blah,blah,4]。这两个集合确实不一样。