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

Jor*_*orn 36 java collections equals

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

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

Cow*_*wan 44

Apache commons-collections有CollectionUtils#isEqualCollection:

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

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

我认为,这正是你所追求的.

  • @ChrisGonzales,谨防这个解决方案 - 它将在以下两个集合中返回true:collection1 = [1,blah,1,4],collection2 = [1,blah,blah,4].这两个系列确实不一样. (33认同)
  • 如果您不想使用Apache(或者您不能),您可以随时执行:collection1.containsAll(collection2)&& collection2.containsAll(collection1) (24认同)

fin*_*nnw 29

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

HashMultiset.create(c1).equals(HashMultiset.create(c2));
Run Code Online (Sandbox Code Playgroud)

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

  • Jorn:事实上,您首先想要这样做是一个强烈的信号,您希望这些集合中的一个或两个首先表示为Multisets.如果你不关心他们的订单,他们在逻辑上不可能是列表.如果您确实将两者都表示为Multisets,那么猜猜是什么?你已经有了单方法调用解决方案! (12认同)