刚刚开始学习Java,并对如何从两个不同的Arraylists中删除常见元素提出疑问?
我的思维过程伴随着:
for(int i =0; i<playerOneInputArray.size(); i++) {
if(playerOneInputArray.contains(playerTwoInputArray.get(i))){
playerOneInputArray.remove(playerTwoInputArray.get(i));
}
}
然而,当我检查输出时,我得到:
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]
我希望在我的新playerOneInputArray中获得[w]
发生了什么? :C
答案 0 :(得分:3)
问题是您同时修改数据结构。具体来说,您正在编辑正在迭代的ArrayList。
考虑从arrayList中删除任何偶数的简化问题。您可以考虑使用这种方法:
public void removeEvens(ArrayList<Integer> arr){
for(int i = 0; i < arr.size(); i++){
if(arr.get(i) % 2 == 0) arr.remove(i);
}
}
但这种方法存在问题。考虑样本输入:
1, 3, 4, 6, 7, 8
当我们点击i = 2
时,我们会正确删除4
。但是,在下一次迭代(i = 3
)中,arrayList现在看起来像:
1, 3, 6, 7, 8
因此,我们正在检查7
,而不是6
。通过删除元素和向前移动i
,我们实际上跳过了检查元素。
您的代码正在执行类似的操作,并遇到类似的问题。您可以使用内置函数(例如removeAll
:
playerOneInputArray.removeAll(playerTwoInputArray);
这会删除playerOneInputArray
的重复项,但是如果您要对playerTwoInputArray
执行此操作,则必须稍微更改一下,因为一旦您删除了ArrayList<Character> duplicates = new ArrayList<Character>(playerOneInputArray);
duplicates.retainAll(playerTwoInputArray);
playerOneInputArray.removeAll(duplicates);
playerTwoInputArray.removeAll(duplicates);
从第一个arrayList重复,你不记得你删除了哪些重复项。如果是这种情况,请考虑:
{{1}}
答案 1 :(得分:0)
您的问题是您在循环中修改了playerOneInputArray
。您的代码无法正常工作,因为当您执行remove()
时,playerOneInputArray.size()
会发生变化。因此,我建议使用removeAll(playerTwoInputArray)
而不是在循环中删除。
答案 2 :(得分:0)
关于您的代码的观察:
当第一个数组长于第二个数组时,您将遇到索引超出范围的异常。
当两个数组具有不同的大小时,您也不会检查数组之间的所有元素,因为您只使用循环的第一个数组的大小。这样做也为我提到的第一个问题创造了潜力。
您需要以某种方式处理这些情况,而不是跳过某些数据或出错。