像'这样的东西包含任何'Java集?

我有两套同类型的A和B。

我必须找出A是否包含集合B中的任何元素。

不遍历集合的最好方法是什么? Set库中有contains(object)containsAll(collection),但没有containsAny(collection)
157558 次浏览

你可以使用retainAll方法来获取两个集合的交集。

在Set接口中使用retainAll()。此方法提供了两个集合中公共元素的交集。有关更多信息,请参阅API文档。

我建议从集合a中创建一个HashMap,然后遍历集合B并检查B中的任何元素是否在a中。这将在O(|A|+|B|)时间内运行(因为没有碰撞),而retainAll(Collection<?> c)必须在O(|A|*|B|)时间内运行。

有一个有点粗糙的方法来做这个。 当且仅当A集合包含某个B的元素时,调用

A.removeAll(B)

将修改A集。在这种情况下,removeAll将返回true(如removeAll文档所述)。但可能你不想修改A集,所以你可能会考虑对副本进行操作,像这样:

new HashSet(A).removeAll(B)

如果集合不不同,也就是说它们有非空交集,返回值为真。

也可参见Apache Commons Collections

Collections.disjoint(A, B)不能工作吗?从文档中可以看到:

如果两个指定的集合没有共同的元素,则返回true

因此,如果集合包含任何公共元素,该方法将返回false

实现集合的containsAny的一个好方法是使用Guava Sets.intersection ()

containsAny将返回boolean,因此调用如下所示:

Sets.intersection(set1, set2).isEmpty()

如果集合不相交,返回true,否则返回false。这种方法的时间复杂度可能比retainAll稍微好一些,因为您不必做任何克隆来避免修改原始集。

Apache Commons有一个方法CollectionUtils.containsAny()

Stream::anyMatch

从Java 8开始,你可以使用Stream::anyMatch

setA.stream().anyMatch(setB::contains)

我使用org.apache.commons.collections.CollectionUtils

CollectionUtils.containsAny(someCollection1, someCollection2)

That is All! 如果两个集合中至少有一个元素,则返回真正的

使用简单,函数名更具启发性。