Java:是否有一种简单、快速的方法可以对集合进行AND、OR或XOR操作?

21

即,如果我有两个或更多集合,并且想要返回一个新的集合,其中包含以下内容:

  1. 每个集合共有的所有元素(AND)。
  2. 每个集合的所有元素(OR)的总和。
  3. 每个集合独有的元素(XOR)。

有没有一种简单的、现成的方法可以做到这一点?

编辑: 那术语不对,是吗?


5
集合的正确术语是并集(或者),交集(并且)和对称差集(异或)。 - Brian
谢谢。在努力回想那个。 - Daddy Warbox
5个回答

36

假设有两个Set对象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); 

查看Set文档和这个页面获取更多信息。


http://java.sun.com/docs/books/tutorial/collections/interfaces/set.html 上的集合教程讨论也可能是有帮助的背景。 - joel.neely
异或运算可以表示为 if (a 中的元素不在 b 中) 或者 (b 中的元素不在 a 中) - Miha_x64

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());

1
应该强调的是,当你有大型集合时,谷歌集合(Google Collections)提供的视图是执行集合操作的更高效方法。特别是如果您不需要遍历结果中的所有元素;您将其用作更复杂算法中的逻辑构造。例如,请参阅http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Sets.html#union%28java.util.Set,%20java.util.Set%29。 - Dilum Ranatunga
1
此外,Set.symmetricDifference() 可用于获取唯一元素。 - Muhd
@DilumRanatunga 链接已失效。 - Boris Churzin
1
https://github.com/google/guava/blob/master/guava/src/com/google/common/collect/Sets.java#L578 - Boris Churzin

3

@Milhous 说:

查看集合API。如果使用addAll,可以得到或操作。如果使用retainAll,可以得到交操作。我不知道Xor。

假设你有集合 s1s2,你可以按照以下步骤获取XOR:

  1. 将集合 s1 复制到 s3
  2. s1.removeAll(s2);(现在的s1包含了所有不在s2中的元素)
  3. s2.removeAll(s3);(现在的s2包含了所有不在s3(旧的s1)中的元素)
  4. s1.addAll(s2);(现在的s1包含了上述两个集合的并集)

1

查看集合 api。如果使用addAll,您可以获得或。如果使用retainAll,您可以获取并且。我不知道Xor是什么。

编辑:来自集合文档。

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

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


不是 [xor] 是 [starting set - or] 的组合吗? - Esko

0

我非常确定Jakarta Common Collections API支持并集、交集等操作。

如果Google Collections API不支持这些操作,我会感到惊讶的。


遗憾的是,Commons Collections Lib 不提供泛型。 - ivan_ivanovich_ivanoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接