2008-10-02 111 views
59

对java.util.Collection类的经典集合操作是否有任何内置功能?我的具体实现是ArrayList,但这听起来像是应该适用于Collection的所有子类的东西。我正在寻找类似的东西:java.util.Collection的经典集合操作

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

经过一番搜索,我只能找到本土解决方案。另外,我意识到我可能会混淆“集合”的想法与“集合”的想法,不允许和允许重复分别。也许这只是Set接口的功能?

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

回答

101

相交是用Collection.retainAll完成;用Collection.removeAll减去;与Collection.addAll联合。在每种情况下,由于Set将表现得像一个集合,并且List将像列表一样行事。

作为可变对象,它们在适当的位置运行。如果你想保留未改变的原始可变对象,你需要显式复制。

7

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

+0

更好的链路做到这一点(Java 6的文档):HTTP://java.sun。 com/javase/6/docs/api/java/util/Set.html – 2008-10-02 19:12:17

5

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

对于imutable变种,你可以用java 8

减法

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

路口

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