我有两套相同类型的套装,A和B.
我必须找到A是否包含集合B中的任何元素。
如果不迭代集合,最好的方法是什么?
Set库有contains(object)
和containsAll(collection)
,但不是containsAny(collection)
。
答案 0 :(得分:442)
答案 1 :(得分:112)
从Java 8开始:setA.stream().anyMatch(setB::contains)
答案 2 :(得分:26)
实现containsAny for sets的一种好方法是使用Guava Sets.intersection()。
containsAny
会返回boolean
,因此调用如下:
Sets.intersection(set1, set2).isEmpty()
如果集合是不相交的,则返回true,否则返回false。这个时间复杂度可能比retainAll略好,因为您不必进行任何克隆以避免修改原始集。
答案 3 :(得分:19)
Apache Commons有一个方法CollectionUtils.containsAny()
。
答案 4 :(得分:10)
我使用 org.apache.commons.collections.CollectionUtils
CollectionUtils.containsAny(someCollection1, someCollection2)
这就是全部! 如果两个集合中至少有一个元素,则返回 true 。
使用简单,功能名称更具启发性。
答案 5 :(得分:5)
在Set界面中使用retainAll()
。该方法提供了两组中共同的元素的交集。有关详细信息,请参阅API文档。
答案 6 :(得分:3)
您可以使用retainAll方法获取两组的交集。
答案 7 :(得分:3)
我建议从集合A创建HashMap
,然后迭代集合B并检查B中的任何元素是否在A中。这将在O(|A|+|B|)
时间运行(因为没有碰撞),而retainAll(Collection<?> c)
必须在O(|A|*|B|)
时间内运行。
答案 8 :(得分:3)
有一种粗略的方法可以做到这一点。 当且仅当A集包含一些B的元素而不是调用
A.removeAll(B)
将修改A集。在这种情况下,removeAll将返回true(如removeAll docs所述)。但是你可能不想修改A集,所以你可能会认为在副本上行事,就像这样:
new HashSet(A).removeAll(B)
如果集合不明显,则返回值为true,即它们具有非空交集。