爪哇:有没有一种简单、快速的方法可以将 AND、OR 或 XOR 组合在一起?

StackOverflow https://stackoverflow.com/questions/393968

  •  23-08-2019
  •  | 
  •  

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

  1. 每个集合的所有元素都有共同点 (AND)。
  2. 每组的所有元素总计 (OR)。
  3. 每组的所有元素都是独一无二的。(异或)。

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

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

有帮助吗?

解决方案

假设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 类 它具有交集()、联合()和对称差异()方法。

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

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

@米尔豪斯 说:

查看sets api。如果您使用addall,则可以或。如果您使用保留,则可以得到。我不知道XOR。

好像你有套装 s1s2 你可以这样做来获得异或:

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

查看集合 应用程序编程接口. 。如果你使用 addAll 你可以得到 or 。如果您使用retainAll,您可以获得and。我不知道异或。

编辑: 来自设置文档。

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

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

我很确定 Jakarta Common Collections API 支持并集、交集等。

如果 Google Collections API 没有做到这一点,我会感到惊讶。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top