像“包含任何”的Java设置?

我有两组同一types的A和B.

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

没有迭代集合,最好的方法是什么? Set库contains(object)containsAll(collection) ,但不containsAny(collection)

Collections.disjoint(A, B)不会合作吗? 从文档:

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

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

由于Java 8: setA.stream().anyMatch(setB::contains)

实现containsAny for sets的好方法是使用Guava Sets.intersection() 。

containsAny会返回一个boolean ,所以调用如下所示:

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

如果这些集合是不相交的,则返回true,否则返回false。 这个时间的复杂性可能比retainAll稍微好一点,因为你不需要做任何克隆来避免修改你的原始集合。

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

在Set界面中使用retainAll() 。 这个方法提供了两个通用的元素的交集。 有关更多信息,请参阅API文档。

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

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

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

 CollectionUtils.containsAny(someCollection1, someCollection2) 

就这些! 如果两个集合中至less有一个元素,则返回true

使用简单,function的名称更具启发性。

有一个粗略的方法来做到这一点。 当且仅当A集合包含比呼叫更多的B元素时

 A.removeAll(B) 

将修改A集。 在这种情况下,removeAll将返回true(正如在removeAll文档中所述 )。 但可能你不想修改A集,所以你可能会想这样做,就像这样:

 new HashSet(A).removeAll(B) 

如果集合不明确,返回值为真,即非空交集。

另请参阅Apache Commons Collections