Java.util.Collection的经典集合操作

65

java.util.Collection类中是否有经典集合操作的内置功能?我的具体实现将是针对ArrayList,但这似乎应该适用于Collection的所有子类。我正在寻找类似于以下内容的东西:

ArrayList<Integer> setA ...
ArrayList<Integer> setB ...
ArrayList<Integer> setAintersectionB = setA.intersection(setB);
ArrayList<Integer> setAminusB = setA.subtract(setB);

在经过一些搜索后,我只能找到自己编写的解决方案。此外,我意识到可能混淆了“Set”和“Collection”的概念,分别允许和不允许重复项。也许这真的只是Set接口的功能?

如果没有人知道任何内置功能,也许我们可以将其用作标准实践Java set操作代码的存储库?我想象这个轮子已经被重新发明了无数次。

4个回答

110

使用Collection.retainAll进行交集操作;使用Collection.removeAll进行差集操作;使用Collection.addAll进行并集操作。在每种情况下,Set将像一个集合一样工作,而List将像一个列表一样工作。

由于它们是可变对象,所以它们会就地操作。如果您希望保留原始可变对象的不可变状态,则需要显式复制。


16

问题是关于在java.util.Collection类上进行“经典集合操作”的。 - user9903

8

对于可变操作,请参阅已接受的答案。

对于不可变的变体,您可以使用Java 8执行此操作

减法

set1
  .stream()
  .filter(item-> !set2.contains(item))
  .collect(Collectors.toSet())

交集

set1
  .stream()
  .filter(item-> set2.contains(item))
  .collect(Collectors.toSet())

7

您是否正在寻找java.util.Set接口(及其实现HashSet和TreeSet(已排序))?
该接口定义了removeAll(Collection c)方法,类似于substract(),以及retainAll(Collection c)方法,类似于intersection。


更好的链接(Java 6 文档):http://java.sun.com/javase/6/docs/api/java/util/Set.html - Michael Myers
2
好的回答。然而,这些将修改其中一个集合。如果Ross想要包含解决方案的第三个集合,他需要先克隆一个并将其用作隐式变量。 - Chris Cudmore
mmyer,感谢您指出这一点,我仍然打开了一个Java 1.5文档选项卡来使用Processing,而且我经常被这些烦人的框架所困扰。链接已修复。 - PhiLho

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