【问题标题】:API for set operations in Java? [closed]Java中用于集合操作的API? [关闭]
【发布时间】:2011-05-03 11:32:11
【问题描述】:

是否有用于集合操作的 API,例如联合、交集、差异、笛卡尔积、从一个集合到另一个集合的函数、这些函数的域限制和范围限制……在 Java 中?

请评论(操作的)覆盖范围和性能。

谢谢

【问题讨论】:

    标签: java api set


    【解决方案1】:

    是的,java Set 类。

    通过 Java SE 教程:

    s1.containsAll(s2) — 如果 s2 是 s1 的子集,则返回 true。 (s2 是一个 如果集合 s1 包含 s2 中的所有元素,则为 s1 的子集。)

    s1.addAll(s2) — 将 s1 转换为 s1 和 s2 的并集。 (这 两个集合的并集是包含所有元素的集合 在任何一组中。)

    s1.retainAll(s2) — 将 s1 转换为 s1 和 s2 的交集。 (两个集合的交集是只包含元素的集合 两组通用。)

    s1.removeAll(s2) — 将 s1 转换为(非对称)集合 s1 和 s2 的差异。 (例如,s1减的设定差 s2 是包含所有在 s1 中找到但不在 s2.)

    http://download.oracle.com/javase/tutorial/collections/interfaces/set.html

    【讨论】:

      【解决方案2】:

      我不知道任何 API,但使用以下方法在 Set 上执行此类操作。

      public static <T> Set<T> union(Set<T> setA, Set<T> setB) {
          Set<T> tmp = new TreeSet<T>(setA);
          tmp.addAll(setB);
          return tmp;
        }
      
        public static <T> Set<T> intersection(Set<T> setA, Set<T> setB) {
          Set<T> tmp = new TreeSet<T>();
          for (T x : setA)
            if (setB.contains(x))
              tmp.add(x);
          return tmp;
        }
      
        public static <T> Set<T> difference(Set<T> setA, Set<T> setB) {
          Set<T> tmp = new TreeSet<T>(setA);
          tmp.removeAll(setB);
          return tmp;
        }
      
        public static <T> Set<T> symDifference(Set<T> setA, Set<T> setB) {
          Set<T> tmpA;
          Set<T> tmpB;
      
          tmpA = union(setA, setB);
          tmpB = intersection(setA, setB);
          return difference(tmpA, tmpB);
        }
      
        public static <T> boolean isSubset(Set<T> setA, Set<T> setB) {
          return setB.containsAll(setA);
        }
      
        public static <T> boolean isSuperset(Set<T> setA, Set<T> setB) {
          return setA.containsAll(setB);
        }
      

      参考:Set operations: union, intersection, difference, symmetric difference, is subset, is superset

      【讨论】:

        【解决方案3】:

        Google Guava 库也有很多有用的方法(例如设置联合和差异)。

        https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Sets

        示例(来自上面链接的页面):

        Set<String> wordsWithPrimeLength = ImmutableSet.of("one", "two", "three", "six", "seven", "eight");
        Set<String> primes = ImmutableSet.of("two", "three", "five", "seven");
        
        SetView<String> intersection = Sets.intersection(primes, wordsWithPrimeLength); // contains "two", "three", "seven"
        // I can use intersection as a Set directly, but copying it can be more efficient if I use it a lot.
        return intersection.immutableCopy();
        

        【讨论】:

        【解决方案4】:

        java.util.Set 类的 API 中没有这些调用,但您可以组合 removeAll()retainAll()addAll() 等操作来执行联合、交叉和差异。我不确定我知道你所说的域限制是什么意思。

        【讨论】:

        • 谢谢。我也在谈论集合函数的操作。
        【解决方案5】:

        Set from the API

        您可以使用接受任何 Collection 作为输入参数的 retainAll、removeAll 和 addAll 方法“模拟”交集、差异、域限制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-26
          • 2011-08-18
          • 2010-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多