Java 计算两个重复列表的差异
我有两张单子Java 计算两个重复列表的差异,java,arraylist,iterator,java-stream,Java,Arraylist,Iterator,Java Stream,我有两张单子 List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 2)); List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 3, 4)); listlist1=newarraylist(Arrays.asList(1,2,2)); list2=新的ArrayList(Arrays.asList(2,3,4)); 我想从l
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 2));
List<Integer> list2 = new ArrayList<>(Arrays.asList(2, 3, 4));
listlist1=newarraylist(Arrays.asList(1,2,2));
list2=新的ArrayList(Arrays.asList(2,3,4));
我想从list1
中删除list2
中包含的元素,删除次数与list2
中包含的次数相同。在上面的例子中:当我们删除列表1中存在于列表2中的元素时,我们应该得到结果[1,2]
(只应从list1
中删除一个出现的2
,因为list2
只包含一个2
的实例)
我尝试了list1.removeAll(list2)代码>但我得到的结果列表只包含[1]
实现这一目标的最佳方式是什么?同时遍历这两个列表对我来说似乎有点难看。怎么样:
list2.forEach(i -> {
list1.remove(i); //removes only first occurrence - if found
});
list1
现在包含
[1, 2]
[1, 2]
[1, 2]
如果我理解正确,您只想从list1
中删除一个2
元素,而不是全部。您可以迭代list2
并尝试从list1
中删除每个元素。请记住,如果list2
不能包含重复项,则有比此更有效的方法
var list1 = new ArrayList<>(List.of(1, 2, 2));
var list2 = List.of(2, 3, 4);
list2.forEach(list1::remove);
有关相同的解决方案,请参阅,但使用lambda而不是方法参考。给定
List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 2));
List<Integer> b = Arrays.asList(2, 3, 4);
a
现在包含
[1, 2]
[1, 2]
[1, 2]
在原邮政局提供信用证:
2。Apache Commons
这里有一个减法方法
Collection<Integer> result = CollectionUtils.subtract(a, b);
这是
3。番石榴
b.forEach((i)->a.remove(i));
由于番石榴不提供减法
方法,您可能会觉得很有帮助
“创建包含a的ArrayList,然后为b中的每个元素对其调用remove。”
这基本上呈现了在1.中已经提到的“1和2,而不仅仅是1”-我不明白,你能发布结果列表吗?人们在这里被否决答案的方式是不公平的。你只是结束了这个问题,因为它没有很好的表述。。这需要解释得更清楚。@arthur:对不完全理解问题的答案投否决票是有道理的。根据定义,一个与这个问题无关的答案是错误的。@arthur在对不正确的答案投反对票时,究竟什么是不公平的?例如,starman1979提供的答案与list1.removeAll(list2)完全相同代码>那么OP当前使用的是什么。higz555给出的答案基本上是从每个列表中删除重复项,但这似乎也不是OP想要的。“向下投票应该保留在极端情况下。它并不是用来代替交流和编辑。”您的解决方案与OP的解决方案有什么不同?第一次尝试时+1,并至少提供所需的结果@Pshemo如果否决,也许能想出一个更优雅的解决方案?@jschnasse好吧,我错了。没有注意到remove
只删除指定元素的第一次出现,而不是全部。但这也是我在这里发表第一条评论的原因。答案不应仅包含解决方案、问题解释和说明解决方案解决问题的方式/原因也很重要。不幸的是,除非对答案进行编辑,否则我无法更改我的投票结果(并且我不会对其进行追加投票,除非它包含一些关于为什么/如何解决问题的解释)。对不起,伙计们,你能解释一下为什么这比@starman1979建议的要好吗?+1向我们展示了var
@在发布我的答案之前,我甚至没有看到他们的答案,但他们的答案看起来是正确的。我不知道为什么会被否决。@PshemoList#removeAll
从list1
中删除list2
@PshemoList中包含的所有元素(而不仅仅是一个)。removeAll(其他)
类似于List.removeIf(其他::包含)
,而此解决方案是other.forEach(List::remove)
。他们之间的区别正是问题所在。