像“包含任何”的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