【问题标题】:Is there a way to check if two Collections contain the same elements, independent of order?有没有办法检查两个集合是否包含相同的元素,与顺序无关?
【发布时间】:2010-12-06 14:49:59
【问题描述】:

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

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

【问题讨论】:

    标签: java collections equals


    【解决方案1】:

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

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

    【讨论】:

    • 那行不通,因为它会丢弃重复的元素。另外,我必须创建两个新的 HashSet。我宁愿避免为此创建新对象。
    • 如果您不关心重复,这很好,例如c1 = Arrays.asList(1, 1, 2), c2 = Arrays.asList(1, 2, 2) 根据这个表达式将相等。
    • 没错,但我确实关心重复项(正如问题现在所说的那样)
    【解决方案2】:

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

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

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

    【讨论】:

    • 这似乎是迄今为止我见过的最有效(也是最简单)的解决方案。
    • 我并不是说这是我要求的解决方案,但我还没有看到为我提供单个方法调用来执行此操作的答案。
    • @Jorn:如果你想要“是”的答案,那么你不会得到它:-)
    • Jorn:您首先想要这样做的事实是一个强烈的信号,表明您希望首先将这些集合中的一个或两个表示为 Multisets。如果您不关心它们的顺序,它们在逻辑上就不能真正成为列表。如果您确实将两者都表示为多重集,那么您猜怎么着?您已经获得了单方法调用解决方案!
    • 从@Cowan 的回答中查看 CollectionUtils.isEqualCollection 源代码,您会发现这正是它在那里完成的方式,但 isEqualCollection 更具表现力,因此得到了我的投票。当然,如果您不使用 commons-collections 但您使用的是 Guava,那么这可能是一个更可取的选择。
    【解决方案3】:

    Apache commons-collections 有 CollectionUtils#isEqualCollection:

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

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

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

    【讨论】:

    • 如果你不想使用 Apache(或者你不能),你总是可以这样做:collection1.containsAll(collection2) && collection2.containsAll(collection1)
    • @ChrisGonzales,请注意该解决方案 - 以下两个集合将返回 true:collection1 = [1, blah, 1, 4],collection2 = [1, blah, blah, 4]。这两个集合确实不一样。
    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多