类似于'包含任何'的Java设置?

时间:2012-01-03 06:08:18

标签: java

我有两套相同类型的套装,A和B.

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

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

9 个答案:

答案 0 :(得分:442)

Collections.disjoint(A, B)不会有效吗?来自文档:

  

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

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

答案 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,即它们具有非空交集。

另见Apache Commons Collections