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

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

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


当前回答

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

其他回答

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

containsAny将返回一个布尔值,因此调用如下所示:

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

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

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

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

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

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