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集操作代码的存储库?我想这个轮子已经多次重新发明了。
答案 0 :(得分:108)
交叉与Collection.retainAll
完成;用Collection.removeAll
减法;与Collection.addAll
联合。在每种情况下,Set
将像一个集合,List
将像列表一样。
作为可变对象,它们在适当的位置运行。如果要保留原始可变对象未突变,则需要显式复制。
答案 1 :(得分:15)
我会推荐Google Guava。 Sets类似乎正是您正在寻找的。它有intersection方法和difference方法。
如果您有兴趣,This presentation可能是您想要观看的内容。它指的是Google Collections,它是Guava的原始名称。
答案 2 :(得分:7)
您正在寻找java.util.Set接口(及其实现HashSet和TreeSet(已排序))?
接口定义了removeAll(Collection c),它看起来像substract(),而retainAll(Collection c)看起来像是交集。
答案 3 :(得分:7)
对于可变操作,请参阅已接受的答案。
对于一个可变的变体,你可以用java 8
来做到这一点减法
set1
.stream()
.filter(item-> !set2.contains(item))
.collect(Collectors.toSet())
相交
set1
.stream()
.filter(item-> set2.contains(item))
.collect(Collectors.toSet())