Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算两个重复列表的差异_Java_Arraylist_Iterator_Java Stream - Fatal编程技术网

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
@在发布我的答案之前,我甚至没有看到他们的答案,但他们的答案看起来是正确的。我不知道为什么会被否决。@Pshemo
List#removeAll
list1
中删除
list2
@Pshemo
List中包含的所有元素(而不仅仅是一个)。removeAll(其他)
类似于
List.removeIf(其他::包含)
,而此解决方案是
other.forEach(List::remove)
。他们之间的区别正是问题所在。