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

Posted

技术标签:

【中文标题】java.util.Collection 的经典集合操作【英文标题】:Classical set operations for java.util.Collection 【发布时间】:2010-09-14 21:46:38 【问题描述】:

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 集合操作代码的存储库?我想这个***已经被重新发明了无数次。

【问题讨论】:

【参考方案1】:

Collection.retainAll的交集;用Collection.removeAll减法;与Collection.addAll 联合。在每种情况下,Set 的作用类似于集合,List 的作用类似于列表。

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

【讨论】:

【参考方案2】:

我会推荐Google Guava。 Sets 类似乎正是您想要的。它有一个intersection 方法和一个difference 方法。

This presentation 可能是您感兴趣的内容。它指的是 Google Collections,这是 Guava 的原始名称。

【讨论】:

问题是关于“java.util.Collection 类的经典集合操作”【参考方案3】:

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

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

减法

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

路口

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

【讨论】:

【参考方案4】:

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

【讨论】:

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

以上是关于java.util.Collection 的经典集合操作的主要内容,如果未能解决你的问题,请参考以下文章

java----数据结构与算法----JavaAPI:java.util.Collection接口

java源码 -- java.util.Collection

java.util.Collection 为啥不实现新的 Stream 接口?

java.util (Collection接口和Map接口)

java.util.Collection List与其子类 Set与其子类

如何正确实现java.util.Collection类?