[英]Java Collections - Quickest way to find if there is a Common element between two Sets
我有两组来自 Guava HashMultimap.values()
。
我需要找出这两个非空集是否具有最佳时间复杂度的交集。
我不需要知道共同元素,只要至少有一个共同元素。
我正在考虑使用Sets.intersection()
,但它具有时间复杂度O(m+n) 。 我们能否在不创建整个交集的情况下找出是否存在共同元素?
类似(伪代码):
set.intersection(set2).any()
数据集非常大,这个操作发生在一个循环中,因此性能是最重要的。
使用正常的JDK,这只是
!Collections.disjoint(set1, set2)
如果找到一个共同的元素,这会立即失败。
(虽然 - 为了它的价值 - Sets.intersection
比你意识到的更Sets.intersection
。它以恒定时间返回一个视图,并且它的isEmpty()
方法也会在找到第一个共同元素后立即保释,所以它会是同样有效率。)
您可以使用Collection#retainAll() 。
仅保留此集合中包含在指定集合中的元素(可选操作)。 换句话说,从此集合中删除未包含在指定集合中的所有元素。
可以使用 Stream API 以最佳情况时间复杂度Θ(1)来完成。
我们可以在第一个集合中的元素上创建一个stream ,并使用anyMatch()
将每个元素与第二个集合进行检查。
boolean hasIntersection = set1.stream().anyMatch(set2::contains);
流是惰性的,并且anyMatch()
- 是一个短路终端操作,这意味着在作为参数传递的谓词的第一个元素将被评估为true
之后,stream 将终止产生结果值,并且所有剩余的元素将不被处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.