我有两个清单。
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
。
实现这一目标的最佳方法是什么?同时迭代这两个列表似乎对我来说有点难看。
答案 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]
第3。番石榴强>
由于番石榴没有提供subtract
方法,您可能会发现this advice from the google implementors有用
&#34;创建一个包含a的ArrayList,然后为b中的每个元素调用remove。&#34;
这基本上呈现了 1
下已经提到的内容