【问题标题】:Intersection of multiple sets (as collections)多个集合的交集(作为集合)
【发布时间】:2015-07-22 17:49:46
【问题描述】:

如何在 Java 中找到多个(多于两个)集合的交集?

retainAll 本身不起作用,因为我需要能够获得两个以上集合之间的交集

【问题讨论】:

  • 有什么代码可以给我们看看吗?
  • @SamM 哦,我将其发布为答案。我没有意识到我必须等待 2 天才能接受我的答案。我是新手,这是我第一次检查“回答你自己的问题”框。希望我没有误用它。
  • 为什么会被否决
  • 这个问题看起来你在提问之前没有做任何研究,这通常是一个投反对票的诱饵,但既然你自己回答了,那就错了

标签: java intersection


【解决方案1】:

您可以使用 Set 的 retainAll(other) 方法,该方法仅保留两个集合中的项目。它会更改原始集,因此您可能需要先获取该集的副本(使用适当的构造函数)。

【讨论】:

    【解决方案2】:
    public static <T> Collection<T> getIntersection(Collection<T>... sets) {
    
        Collection<T> firstSet;
    
        if (sets == null || sets.length == 0 || (firstSet = sets[0]) == null)
            return Collections.<T>emptySet();
    
        Collection<T> intersection = new HashSet(firstSet);
    
        for (Collection c : sets) {
            if (c == null) 
                return Collections.<T>emptySet();
            intersection.retainAll(c);
        }
        return intersection;
    }
    

    【讨论】:

    • 这可能有效,但它正在重新发明轮子。有一个内置方法 retainAll() 可以完成相同的工作。
    • 感谢@aetheria,我更改了答案以实现retainAll
    • 2 个其他提示:如果您使用可变参数,我不认为它 (sets) 可以是 null。您应该检查sets.length != 0 并且也许检查null 的元素sets。另外,当您承诺返回Collection 时,不要返回null,这是一个好习惯!返回Collections.&lt;T&gt;emptyList()Collections.&lt;T&gt;emptySet(),或者抛出Exception,如果你认为null 值会破坏游戏规则。
    • @bali182 很酷,谢谢!我编辑了每年的建议。此外,nullsets 输入似乎也可以正常工作
    • getIntersection() 不是简单地返回传递给它的内容吗?这就是我使用它时的作用。假设您传递的集合中的第一个集合是(11,12),其他集合是(1,3,4,5)等,并且不包含第一个集合中包含的任何元素,那么不会使用retainAll()导致一个空的结果集?正如 retainall() 的 javaDoc 状态“......从这个集合中删除所有不包含在指定集合中的元素......”所以如果前 2 个集合没有匹配,那么所有后续使用的 retainAll( ) 将产生一个空集。
    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多