所以我有两个集合:A和B.我需要检查集合B是否包含不在集合A中的任何东西。可能有交叉点,所以我不能只检查集合A是否包含集合B. 我显然可以这样做:
for (String string : setA) {
if (!setB.contains(string) {
break;
}
}
或使用Guava库:
Sets.intersection(setA, setB).containsAll(setB); // returns false if there are elements outside.
但有没有什么方法可以表现得更好或者可能更干净或更优雅? 感谢。
答案 0 :(得分:3)
将所有元素合并到另一个集合中并比较总元素:
Set ab = new Set(a);
ab.addAll(b);
if (ab.size() != b.size()) break; // that means `a` had some element that was not in b
答案 1 :(得分:3)
使用流(并行)和功能混合的另一种方式
wills
与
相同setB.parallelStream().filter(((Predicate<String>)setA::contains).negate()).findFirst();
答案 2 :(得分:2)
duplicateSet.removeAll(otherSet)
xyz = SetUtils.difference(seta, setb)
; 答案 3 :(得分:2)
“B
包含不在 A
中的元素”与“A
完全相反”包含 {的所有元素{1}}“因此,现有的方法B
足以回答这个问题。
containsAll
您可以使用if(!setA.containsAll(setB)) {
System.out.println("setB contains an element not in setA");
}
进行快捷方式,但这要求这些集合同意相等的定义,例如:如果一个集合是setB.size()>setA.size() || !setA.containsAll(setB)
使用SortedSet
作为比较器而另一个集合是String.CASE_INSENSITIVE_ORDER
,那么这将不起作用(但无论如何,正确结果的定义是非常棘手的)。
如果HashSet
非常大,您可能会从使用像
setB
但这种情况很少见。
答案 4 :(得分:0)
您可以尝试使用从setB中删除元素的算法:
if (setB.size() > setA.size()) {
return true;
}
for (String s : setA) {
//boolean contains = setB.contains(s);
boolean contains = setB.remove(s);
if (contains) return true;
}