【问题标题】:Compare two lists of string using java stream使用java流比较两个字符串列表
【发布时间】:2019-04-08 21:43:39
【问题描述】:

我有两个列表 A 和 B。它们都有数百万个元素。我想比较并获取列表 A 中但不在列表 B 中的所有元素。以下是获取元素的低效方法。

   if (!B.containsAll(A)) {
        for (Integer id : A) {
            if (!B.contains(id)) {
                System.out.println(id);
            }
        }
    }

我正在寻找一种有或没有流的有效方式来获取元素

在这方面的帮助表示赞赏。

谢谢

【问题讨论】:

标签: java list java-stream


【解决方案1】:

你不需要比较

List<Integer> c = new ArrayList<>(a);
c.removeAll(b);

如果您不介意丢失原始列表数据

a.removeAll(b);

【讨论】:

  • 根据输入列表的大小,创建Set 而不是ArrayList 可能更有效(但不一定,请参阅stackoverflow.com/questions/28671903/…)。无论哪种方式,虽然这是一种简单易读的方法,但它首先会创建一个包含“数百万个元素”的列表的完整副本。
  • @Hulk 如果您不介意丢失原始列表,则无需创建副本。
【解决方案2】:

这样就足够了:

Set<Integer> container = new HashSet<>(ListB);
ListA.stream()
     .filter(id -> !container.contains(id))
     .forEach(System.out::println);

或非流媒体:

Set<Integer> container = new HashSet<>(ListB);
for(Integer id : ListA)
    if(!container.contains(id));
       System.out.println(id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多