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

时间:2018-03-21 15:52:22

标签: java arraylist iterator java-stream

我有两个清单。

type

我想从List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 2)); List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 3, 4)); 中移除list2中包含的元素,正好与list1中包含的元素一样多。在上面的示例中:当我们删除列表1中存在于列表2中的元素时,我们应该得到结果list2(只应从[1, 2]中删除一次2,因为{{ 1}}只包含list1)的一个实例。

我尝试使用list2,但我得到的结果列表只包含2

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

3 个答案:

答案 0 :(得分: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而不是方法参考。

答案 1 :(得分:3)

怎么样:

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

list1现在包含

[1, 2]

答案 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有用

  

&#34;创建一个包含a的ArrayList,然后为b中的每个元素调用remove。&#34;

这基本上呈现了 1

下已经提到的内容