java - 如何检查集合 B 是否至少有一个不在集合 A 中的元素

标签 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.

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

最佳答案

B 包含一个不在A中的元素”与“A 完全相反包含 B”的所有元素”,因此,现有的方法containsAll足以回答这个问题。

if(!setA.containsAll(setB)) {
    System.out.println("setB contains an element not in setA");
}

您可以使用 setB.size()>setA.size() || 快捷方式!setA.containsAll(setB),但这需要集契约(Contract)意相等的定义,例如如果一个集合是使用 String.CASE_INSENSITIVE_ORDER 作为比较器的 SortedSet 而另一个是 HashSet,这将不起作用(但是无论如何,这种组合的正确结果是棘手的)。

如果 setB 非常大,您可能会从使用像这样的并行流中获益

if(!setB.parallelStream().allMatch(setA::contains)) {
    System.out.println("setB contains an element not in setA");
}

但这种情况很少见。

关于java - 如何检查集合 B 是否至少有一个不在集合 A 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45966860/

相关文章:

.net - 这两种访问器/ getter / setter 方法之间的区别?

c - C 中的模糊逻辑隶属函数

java - "Before and After"谜题有更好的解决方案吗?

java - 从 try finally block 中的 try block 返回

java 3D绘图

java - lambda 表达式中的错误返回类型 : Predicate<T> cannot be converted to Criteria<T>

java:不兼容的类型:推理变量 T 具有不兼容的边界等式约束:下限:java.util.List<>

java - 用Java读取XSD文件

java - 为什么混合GC无法清除内存,而Full DC却可以?

java - 打印一定范围内的不重复随机数