如何删除两个不同ArrayLists中的两个相同元素?

时间:2015-03-02 19:37:09

标签: java

刚刚开始学习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

3 个答案:

答案 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)

关于您的代码的观察:

当第一个数组长于第二个数组时,您将遇到索引超出范围的异常。

当两个数组具有不同的大小时,您也不会检查数组之间的所有元素,因为您只使用循环的第一个数组的大小。这样做也为我提到的第一个问题创造了潜力。

您需要以某种方式处理这些情况,而不是跳过某些数据或出错。