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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算具有重复项的两个列表的差异相关的知识,希望对你有一定的参考价值。

我有两个清单。

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]

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

答案

如果我理解正确,你只想从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而不是方法引用。

另一答案

怎么样:

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

list1现在包含

[1, 2]
另一答案

特定

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中已经提到的内容。

以上是关于计算具有重复项的两个列表的差异的主要内容,如果未能解决你的问题,请参考以下文章

在 Dart 中合并两个对象列表

如何在不删除先前相同值的情况下选择具有重复项的列表中的特定数字?

Excel:在多列中查找具有重复项的多个值

13 个非常有用的 Python 代码片段

如何计算两个日期时间的月份差异? [重复]

两个日期之间的天数差异[重复]