【发布时间】:2011-05-03 11:32:11
【问题描述】:
是否有用于集合操作的 API,例如联合、交集、差异、笛卡尔积、从一个集合到另一个集合的函数、这些函数的域限制和范围限制……在 Java 中?
请评论(操作的)覆盖范围和性能。
谢谢
【问题讨论】:
是否有用于集合操作的 API,例如联合、交集、差异、笛卡尔积、从一个集合到另一个集合的函数、这些函数的域限制和范围限制……在 Java 中?
请评论(操作的)覆盖范围和性能。
谢谢
【问题讨论】:
是的,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
【讨论】:
我不知道任何 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
【讨论】:
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();
【讨论】:
java.util.Set 类的 API 中没有这些调用,但您可以组合 removeAll()、retainAll() 和 addAll() 等操作来执行联合、交叉和差异。我不确定我知道你所说的域限制是什么意思。
【讨论】:
您可以使用接受任何 Collection 作为输入参数的 retainAll、removeAll 和 addAll 方法“模拟”交集、差异、域限制。
【讨论】: