我有两套同类型的A和B。
我必须找出A是否包含集合B中的任何元素。
不遍历集合的最好方法是什么? Set库有contains(object)和containsAll(collection),但没有containsAny(collection)。
我有两套同类型的A和B。
我必须找出A是否包含集合B中的任何元素。
不遍历集合的最好方法是什么? Set库有contains(object)和containsAll(collection),但没有containsAny(collection)。
当前回答
流:anyMatch
从Java 8开始,你可以使用Stream::anyMatch。
setA.stream().anyMatch(setB::contains)
其他回答
不收藏。(A, B)工作脱节?从文档中可以看到:
如果两个指定的集合没有共同的元素,则返回true。
因此,如果集合包含任何公共元素,则该方法返回false。
流:anyMatch
从Java 8开始,你可以使用Stream::anyMatch。
setA.stream().anyMatch(setB::contains)
有一个粗略的方法。 当且仅当A集合包含某个B的元素时调用
A.removeAll(B)
将修改A集。在这种情况下,removeAll将返回true(如removeAll docs中所述)。但可能你不想修改A集,所以你可能会考虑对副本进行操作,像这样:
new HashSet(A).removeAll(B)
如果集合不不同,也就是说它们有非空交集,返回值为真。
参见Apache Commons Collections
实现集合的containsAny的一个好方法是使用Guava sets .intersection()。
containsAny将返回一个布尔值,因此调用如下所示:
Sets.intersection(set1, set2).isEmpty()
如果集合不相交,返回true,否则返回false。这种方法的时间复杂度可能比retainAll稍微好一些,因为您不必做任何克隆来避免修改原始集。
您可以使用retainAll方法获取两个集合的交集。