有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (3) 个答案

  1. # 1 楼答案

    您的问题是您修改了playerOneInputArrayin循环。你的代码没有像你期望的那样工作,因为当你做remove()的时候,playerOneInputArray.size()就会改变。因此,我建议使用removeAll(playerTwoInputArray)而不是在循环中删除

  2. # 2 楼答案

    对代码的观察:

    当第一个数组比第二个数组长时,会遇到索引越界异常

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

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

  3. # 3 楼答案

    问题是,您正在同时修改数据结构。具体来说,您正在编辑要迭代的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。通过删除元素并向前移动^{,我们实际上跳过了对元素的检查

    您的代码正在执行类似的操作,并且遇到了类似的问题。您既可以简化代码,也可以通过使用内置函数来纠正问题,例如^{

    playerOneInputArray.removeAll(playerTwoInputArray);
    

    这将删除playerOneInputArray中的重复项,但如果您想对playerTwoInputArray执行此操作,则必须对其进行一点更改,因为一旦从第一个arrayList中删除了重复项,您就不记得删除了哪些重复项。如果是这样,请考虑:

    ArrayList<Character> duplicates = new ArrayList<Character>(playerOneInputArray);
    duplicates.retainAll(playerTwoInputArray);
    playerOneInputArray.removeAll(duplicates);
    playerTwoInputArray.removeAll(duplicates);