15

我有两套。(来自 Guava HashMultimap.values())。我需要快速查找,如果这两个集合的交集是非空集合。我不需要知道共同的元素,只要有共同的元素。我正在考虑使用 Sets.intersection,但它是 o(m+n),如果我们找到一个公共元素而不必创建整个交集(类似于 set.intersection(set2).any()),我们可以保释。(数据集非常大,这个操作发生在一个循环中,因此性能是最重要的。)

欢迎任何建议。谢谢你。

4

2 回答 2

34

使用普通的JDK,这只是

!Collections.disjoint(set1, set2)

如果发现一个元素是共同的,这将立即失效。

(尽管——就其价值而言——Sets.intersection比你意识到的更懒惰。它在恒定时间内返回一个视图,并且它的isEmpty()方法也会在找到第一个共同元素后立即退出,所以它同样有效。)

于 2013-09-17T17:26:59.120 回答
4

您可以使用Collection#retainAll()

仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从这个集合中移除所有不包含在指定集合中的元素。

于 2013-09-17T17:23:13.257 回答