如何检查Set B是否至少有一个元素不在Set A中

时间:2017-08-30 17:53:42

标签: java java-8 set

所以我有两个集合: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.

但有没有什么方法可以表现得更好或者可能更干净或更优雅? 感谢。

5 个答案:

答案 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)

Straight Java

  1. 复制“目标”设置。
  2. duplicateSet.removeAll(otherSet)
  3. 如果duplicateSet不为空,则目标包含一个或多个不在“otherSet”中的元素
  4. Apache SetUtils

    1. xyz = SetUtils.difference(seta, setb);
    2. if xyz.size()&gt; 0然后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;
}