如何计算两个集合的交集?

290

9
公正地说,这个问题比原来的好多了。它清晰、写得好,并且抓住了重点。尽管最终答案相同,但另一个问题只是一堆言词-关注效率而不是只是完成工作。然而,对于Java 8+,这可能是更好的答案:https://dev59.com/Y3E85IYBdhLWcg3wShef#39902694 - Lambart
2个回答

537

使用retainAll()方法来操作Set

Set<String> s1;
Set<String> s2;
s1.retainAll(s2); // s1 now contains only elements in both sets
如果你想保留这些集合,创建一个新的集合来存储它们的交集。
Set<String> intersection = new HashSet<String>(s1); // use the copy constructor
intersection.retainAll(s2);

retainAll() 方法的 javadoc 描述了它正是你想要的:

仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从此集合中删除不包含在指定集合中的所有元素。如果指定的集合也是一个集合,则该操作实际上将修改此集合,使其值为两个集合的 交集


3
对于任何希望在另一个集合上使用retainAll的人来说,这里需要注意一下,例如包含重复元素的列表。根据集合的内容,您可能会抛出UnsupportedOperationException异常,并且它也无法正确地过滤频率(它保留左侧多重集合中值的所有出现,而不管右侧多重集合中该值出现的次数如何)。 - Allison

75

有的,可以使用retainAll方法,参考这里

Set<Type> intersection = new HashSet<Type>(s1);
intersection.retainAll(s2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接