20

也就是说,如果我有两个或更多集合,并且我想返回一个新集合,其中包含:

  1. 每组的所有元素都具有共同点 (AND)。
  2. 每组 (OR) 的所有元素总数。
  3. 每组独有的所有元素。(异或)。

有没有一种简单的、预先存在的方法来做到这一点?

编辑: 这是错误的术语,不是吗?

4

5 回答 5

34

假设 2 设置对象 a 和 b

AND(两组的交集)

a.retainAll(b); 

OR(两组的并集)

a.addAll(b);

XOR 要么滚动你自己的循环:

foreach item
if(a.contains(item) and !b.contains(item) ||  (!a.contains(item) and b.contains(item)))
 c.add(item)

或这样做:

c.addAll(a); 
c.addAll(b);
a.retainAll(b); //a now has the intersection of a and b
c.removeAll(a); 

请参阅设置文档和此页面。更多。

于 2008-12-26T17:03:20.577 回答
9

您可以使用Google-Collections Sets 类,它具有方法 intersection() union() 和 symmetricDifference()。

Sets.intersection(set1, set2);
Sets.union(set1, set2);

SetView view = Sets.intersection(Sets.union(set1, set2), set3);
Set result = view.copyInto(new HashSet());
于 2009-12-28T19:28:48.193 回答
3

@Milhous 说:

查看设置 api。如果你使用 addAll 你可以得到或。如果你使用retainAll,你可以得到and。我不知道Xor。

看起来如果你有集合s1s2你可以这样做来获得 XOR:

  1. 将集合复制s1s3
  2. s1.removeAll(s2); (s1 现在包含所有不在 s2 中的元素)
  3. s2.removeAll(s3); (s2 现在包含所有不在 s3 = 旧 s1 中的元素)
  4. s1.addAll(s2); (s1 现在包含上述两组的并集)
于 2008-12-26T17:02:55.337 回答
1

查看设置api。如果你使用 addAll 你可以得到或。如果你使用retainAll,你可以得到and。我不知道Xor。

编辑:来自集合文档。

...如果指定的集合也是一个集合,则 addAll 操作有效地修改这个集合,使其值是两个集合的并集。

....如果指定的集合也是一个集合,则此操作有效地修改此集合,使其值是两个集合的交集。

于 2008-12-26T16:48:08.097 回答
0

我很确定 Jakarta Common Collections API 支持联合、交叉等。

如果 Google Collections API 没有那么好,我会感到惊讶。

于 2008-12-27T22:59:19.627 回答