使用Java Stream比较两个字符串列表

6

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

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

我希望找到一种高效的方法(使用或不使用流)来获取元素。

在这方面的任何帮助都将不胜感激。

谢谢


2
使用集合。哈希集可以快速检查包含关系。 - khelwood
2个回答

2
你不需要进行比较。
List<Integer> c = new ArrayList<>(a);
c.removeAll(b);

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

a.removeAll(b);

1
根据输入列表的大小,创建一个Set而不是ArrayList可能更有效(但不一定,请参见https://dev59.com/yF4b5IYBdhLWcg3wzUYp)。无论哪种方式,虽然这是一种简单且易读的方法,但它首先会创建一个包含“数百万个元素”的完整列表副本。 - Hulk
@ Hulk 如果您不介意失去原始列表,那么创建副本并不是必要的。 - Guy

1
像这样的东西应该就够了:
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接