2

C是类型的集合Set<T>,F(x)返回Set的集合,我想做的是在集合之间执行诸如联合,交集,差异之类的操作

// C union ( F(X) \ F(Y))
C.addAll( F(X).removeAll( F(Y)))); //error boolean because removeAll returns a boolean

替代我可以

C_aux = new HashSet<T> ( F(X));
C_aux.removeAll( F(Y)); 
C.addAll( C_aux);

无论如何要在不声明辅助集合的情况下执行此操作?(跳过/忽略布尔返回)

4

2 回答 2

6

java.util.Collection API:

a.retainAll(b); // intersection
a.removeAll(b); // difference
a.addAll(b); // union

谷歌番石榴 com.google.common.collect.Sets API:

Sets.union(a, b);
Sets.intersection(a, b);
Sets.difference(a, b);

如果这是您真正需要的,您可以编写单行:

Sets.union(C, Sets.difference(F(X), F(Y)))

但请记住,结果集是只读的,所以如果你需要真正的 SetC.removeAll使用

于 2012-11-30T16:05:38.737 回答
2

怎么样

C.addAll(A.removeAll(B)?A:A);

通常我会认为这是一个笑话,但在这种情况下,您可以省去创建一个列表。在我忘记浇水大约 3 个月后,它仍然像我的“装饰”植物一样丑陋......:P

编辑:这当然也有效,但仍然会改变 A.

A.removeAll(B);
C.addAll(A);

顺便说一句:如果A并且B不能在方法中更改,我认为没有办法创建一个临时列表(无论您是否将其安全地保存在变量中)。至少 ifC最初可以包含元素。

于 2012-11-30T15:55:21.030 回答