Java:有一种简单,快速的AND,OR或XOR集合方法吗?

时间:2008-12-26 16:43:11

标签: java union set intersection

也就是说,如果我有两个或更多集,我想返回一个包含以下内容的新集:

  1. 每组中的所有元素都有共同点(AND)。
  2. 每组(OR)的所有元素总数。
  3. 每组的所有元素都是唯一的。 (XOR)。
  4. 是否有一种简单的,预先存在的方法可以做到这一点?

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

5 个答案:

答案 0 :(得分: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); 

请参阅Set documentation和此page。更多。

答案 1 :(得分:9)

您可以使用具有方法intersection()union()和symmetricDifference()的Google-Collections Sets class

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

SetView view = Sets.intersection(Sets.union(set1, set2), set3);
Set result = view.copyInto(new HashSet());

答案 2 :(得分:3)

@Milhous说:

  

查看套装api。如果你使用   addAll你可以得到或。如果你使用   保留所有你可以得到和。我不   了解Xor。

好像你设置了s1s2,你可以这样做以获得XOR:

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

答案 3 :(得分:1)

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

来自设置文档的

编辑

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

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

答案 4 :(得分:0)

我非常确定Jakarta Common Collections API支持联合,交叉等。

如果Google Collections API不太好,我会感到很惊讶。