计算具有重复项的两个列表的差异
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]
3.番石榴
由于番石榴不提供subtract
方法,你可能会发现this advice from the google implementors有帮助
“创建一个包含a的ArrayList,然后为b中的每个元素调用remove。”
这基本上呈现了1中已经提到的内容。
以上是关于计算具有重复项的两个列表的差异的主要内容,如果未能解决你的问题,请参考以下文章