【问题标题】:Best way to find uncommon elements inside list [duplicate]在列表中查找不常见元素的最佳方法[重复]
【发布时间】:2019-07-14 21:00:48
【问题描述】:

我有String 类型的列表说列表aListabListb 第一个列表可能最多有10 elements 但是bListb 可能有数千甚至更多的元素。现在我必须从 aList 中找到所有不在 bListb 中的元素。这是我的方法

List<String> aLista = Arrays.asList("Anil","Abhishek","Ritu");
List<String> bListb = Arrays.asList("g","o","e","Abhishek","Ritu");

List<String> result3 = aLista.stream().filter(al -> 
!bListb.contains(al)).collect(Collectors.toList());
System.out.println(result3);
// output Anil

但我不确定性能,因为bListb 稍后可能会有很多元素。所以我才知道这样做的最佳方式。感谢您的宝贵时间。

【问题讨论】:

    标签: java collections java-8


    【解决方案1】:

    您可以使用一组。与列表的 O(n) 相比,HashSet 的包含是 O(1),因此如果您经常需要运行包含,则永远不要使用列表。

    Set<String> bSet = new HashSet<>(bListb);
    aLista.stream().filter(a -> !bSet.contains(a)).collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      如果你不关心重复,那么试试这个:

      Set<String> uncommon = new HashSet<>(aLista);
      uncommon.removeAll(bListb);
      

      【讨论】:

      • uncommon.removeAll(new HashSet&lt;&gt;(bListb)) 怎么样? bListb 可能像 OP 所指出的那样巨大(可能会进一步优化)?
      • 是的,在大多数情况下会这样。我只是觉得没有必要重复this的答案。
      【解决方案3】:

      由于aLista 的大小非常有限,而bListb 可能很大,您应该将aLista 转换为Set,而不是bListb

      Set<String> missing = new HashSet<>(aLista);
      for (String s : bListb) {
          if (missing.isEmpty())
              break;
          missing.remove(s);
      }
      

      如果已找到所有值,代码甚至会短路 bListb 的迭代,而将 bListb 转换为 Set 则不允许这种短路逻辑。

      【讨论】:

        猜你喜欢
        • 2010-12-03
        • 1970-01-01
        • 2012-07-06
        • 2018-09-11
        • 2017-06-14
        相关资源
        最近更新 更多