也就是说,如果我有两个或更多集合,并且我想返回一个新集合,其中包含:
- 每组的所有元素都具有共同点 (AND)。
- 每组 (OR) 的所有元素总数。
- 每组独有的所有元素。(异或)。
有没有一种简单的、预先存在的方法来做到这一点?
编辑: 这是错误的术语,不是吗?
也就是说,如果我有两个或更多集合,并且我想返回一个新集合,其中包含:
有没有一种简单的、预先存在的方法来做到这一点?
编辑: 这是错误的术语,不是吗?
假设 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);
您可以使用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());
@Milhous 说:
查看设置 api。如果你使用 addAll 你可以得到或。如果你使用retainAll,你可以得到and。我不知道Xor。
看起来如果你有集合s1
,s2
你可以这样做来获得 XOR:
s1
到s3
s1.removeAll(s2);
(s1 现在包含所有不在 s2 中的元素)s2.removeAll(s3);
(s2 现在包含所有不在 s3 = 旧 s1 中的元素)s1.addAll(s2);
(s1 现在包含上述两组的并集)查看设置api。如果你使用 addAll 你可以得到或。如果你使用retainAll,你可以得到and。我不知道Xor。
编辑:来自集合文档。
...如果指定的集合也是一个集合,则 addAll 操作有效地修改这个集合,使其值是两个集合的并集。
....如果指定的集合也是一个集合,则此操作有效地修改此集合,使其值是两个集合的交集。
我很确定 Jakarta Common Collections API 支持联合、交叉等。
如果 Google Collections API 没有那么好,我会感到惊讶。