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 接口的功能?

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

4

4 回答 4

109

交点是用Collection.retainAll; 减法Collection.removeAll; 与 联合Collection.addAll。在每种情况下,asSet都像一个集合,而 aList像一个列表。

作为可变对象,它们在原地运行。如果要保留原始可变对象不变,则需要显式复制。

于 2008-10-02T19:33:21.387 回答
16

我会推荐谷歌番石榴Sets类似乎正是您想要的。它有相交法和差分法。

如果您有兴趣,此演示文稿可能是您想观看的内容。它指的是 Google Collections,这是 Guava 的原始名称。

于 2008-10-02T19:24:41.643 回答
8

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

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

减法

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

路口

set1
  .stream()
  .filter(item-> set2.contains(item))
  .collect(Collectors.toSet())
于 2015-12-23T16:24:06.760 回答
7

您是否正在寻找java.util.Set接口(及其实现 HashSet 和 TreeSet(已排序))?
该接口定义了看起来像 substract() 的 removeAll(Collection c) 和看起来像交集的 retainAll(Collection c)。

于 2008-10-02T19:09:16.437 回答