计算具有重复项的两个列表的差异

问题描述 投票:2回答:3

我有两个清单。

List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 2));
List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 3, 4));

我想从list2中删除list1中包含的元素,正好与list2中包含的元素一样多。在上面的例子中:当我们删除列表1中存在于列表2中的元素时,我们应该得到[1, 2]的结果(因为2只包含一个list1实例,所以应该从list2中删除一次2)。

我尝试使用list1.removeAll(list2);,但我得到的结果列表只包含[1]

实现这一目标的最佳方法是什么?通过两个列表同时迭代对我来说似乎有点难看。

java arraylist iterator java-stream
3个回答
5
投票

如果我理解正确,你只想从2中删除一个list1元素而不是全部。你可以迭代list2并尝试从list1中删除每个元素。请记住,如果list2不能包含重复项,则有更有效的方法。

var list1 = new ArrayList<>(List.of(1, 2, 2));
var list2 = List.of(2, 3, 4);

list2.forEach(list1::remove);    

list1现在包含以下内容:

[1, 2]

请参阅starman1979's answer了解相同的解决方案,但使用lambda而不是方法引用。


3
投票

怎么样:

list2.forEach(i -> {
    list1.remove(i); //removes only first occurrence - if found
});

list1现在包含

[1, 2]

0
投票

特定

List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 2));
List<Integer> b = Arrays.asList(2, 3, 4);

使用以下变体之一来获得所需的结果:

1.普通的java

b.forEach((i)->a.remove(i));

a现在包含

[1, 2]

给予原始帖子:add +1

2. Apache Commons

apache commons有一个subtract方法

Collection<Integer> result = CollectionUtils.subtract(a, b);

result现在包含

[1, 2]

这是how they implemented it

3.番石榴

由于番石榴不提供subtract方法,你可能会发现this advice from the google implementors有帮助

“创建一个包含a的ArrayList,然后为b中的每个元素调用remove。”

这基本上呈现了1中已经提到的内容。

© www.soinside.com 2019 - 2024. All rights reserved.