【问题标题】:Java Collection. Quickest way to find if there is a Common element between two setsJava 集合。查找两组之间是否存在公共元素的最快方法
【发布时间】:2013-09-22 06:12:24
【问题描述】:

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

欢迎提出任何建议。谢谢。

【问题讨论】:

    标签: java collections guava


    【解决方案1】:

    您可以使用Collection#retainAll()

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

    【讨论】:

    • 但这类似于 Sets.intersection() 对。此操作仍会创建完整的交集。
    • @doc_180:- 是的,没错。你可以试试 Louis Wasserman 的想法。这可能就是你想要的!
    • 我将采用他的想法。 Sets.intersection 可能只是工作,因为它是懒惰的。谢谢你的回答。
    【解决方案2】:

    使用普通的JDK,这只是

    !Collections.disjoint(set1, set2)
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 2020-10-24
      • 1970-01-01
      • 2021-11-03
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多