【问题标题】:Classical set operations for java.util.Collectionjava.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 集合操作代码的存储库?我想这个轮子已经被重新发明了无数次。

【问题讨论】:

    标签: java collections set


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我会推荐Google GuavaSets 类似乎正是您想要的。它有一个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,而且我经常被这些该死的框架集所困扰。链接已修复。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-01
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        • 2017-02-17
        • 1970-01-01
        相关资源
        最近更新 更多