java如何删除两个不同ArrayList中的两个相同元素?
刚开始学习Java,有一个问题是如何从两个不同的ArrayList中删除公共元素
我的思考过程如下:
for(int i =0; i<playerOneInputArray.size(); i++) {
if(playerOneInputArray.contains(playerTwoInputArray.get(i))){
playerOneInputArray.remove(playerTwoInputArray.get(i));
}
}
但是,当我检查出put时,我得到:
Player One! Choose your word!
hello
Player Two! Choose your word!
hellow
[h, e, l, l, o]
[h, e, l, l, o, w]
[e, l]
我希望我的新PlayerInputArray只能得到一个[w]
发生了什么事??:C
# 1 楼答案
您的问题是您修改了
playerOneInputArray
in循环。你的代码没有像你期望的那样工作,因为当你做remove()
的时候,playerOneInputArray.size()
就会改变。因此,我建议使用removeAll(playerTwoInputArray)
而不是在循环中删除# 2 楼答案
对代码的观察:
当第一个数组比第二个数组长时,会遇到索引越界异常
另外,当两个数组的大小不同时,您不会检查数组之间的所有元素,因为您只使用循环的第一个数组的大小。这样做也为我提到的第一个问题创造了可能性
您需要以某种方式处理这些情况,而不是跳过某些数据或出现错误
# 3 楼答案
问题是,您正在同时修改数据结构。具体来说,您正在编辑要迭代的ArrayList
考虑从数组中删除任意偶数的简化问题。你可以考虑使用这种方法:
但这种方法存在一个问题。考虑样本输入:
当我们点击
i = 2
时,我们正确地删除了4
。但是,在下一次迭代(i = 3
)中,arrayList现在看起来像:所以我们检查的是,我们实际上跳过了对元素的检查
7
,而不是6
。通过删除元素并向前移动^{您的代码正在执行类似的操作,并且遇到了类似的问题。您既可以简化代码,也可以通过使用内置函数来纠正问题,例如^{:
这将删除
playerOneInputArray
中的重复项,但如果您想对playerTwoInputArray
执行此操作,则必须对其进行一点更改,因为一旦从第一个arrayList中删除了重复项,您就不记得删除了哪些重复项。如果是这样,请考虑: