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接口)