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

Java 如何删除两个不同ArrayList中的两个相同元素?,java,Java,刚开始学习Java,有一个问题是如何从两个不同的ArrayList中删除公共元素 我的思考过程如下: for(int i =0; i<playerOneInputArray.size(); i++) { if(playerOneInputArray.contains(playerTwoInputArray.get(i))){ playerOneInputArray.remove(playerTwoInputArray.get(i));

刚开始学习Java,有一个问题是如何从两个不同的ArrayList中删除公共元素

我的思考过程如下:

 for(int i =0; i<playerOneInputArray.size(); i++) {
       if(playerOneInputArray.contains(playerTwoInputArray.get(i))){
           playerOneInputArray.remove(playerTwoInputArray.get(i));

       }
   }
我希望我的新PlayerInputArray只能得到一个[w]


发生了什么事??:C

问题在于您同时修改了数据结构。具体地说,您正在编辑要迭代的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);
    }
}
当我们点击
i=2
时,我们正确地删除了
4
。但是,在下一次迭代(
i=3
)中,arrayList现在看起来像:

1, 3, 6, 7, 8
因此,我们正在检查
7
,而不是
6
。通过删除一个元素并向前移动
i
,我们实际上跳过了对元素的检查

您的代码正在执行类似的操作,并且遇到了类似的问题。您可以通过使用内置函数(如
removeAll
)简化代码并纠正问题:

playerOneInputArray.removeAll(playerTwoInputArray);
这将从
playerInputArray
中删除重复项,但如果要对
playerWoInputArray
执行此操作,则必须对其进行一点更改,因为一旦从第一个arrayList中删除了重复项,就记不起删除了哪些重复项。如果是这种情况,请考虑:

ArrayList<Character> duplicates = new ArrayList<Character>(playerOneInputArray);
duplicates.retainAll(playerTwoInputArray);
playerOneInputArray.removeAll(duplicates);
playerTwoInputArray.removeAll(duplicates);
ArrayList duplicates=新的ArrayList(PlayerInputArray);
副本。保留(playerTwoInputArray);
PlayerInputArray.removeAll(重复);
PlayerWOInputArray.removeAll(重复);

问题在于您正在同时修改数据结构。具体地说,您正在编辑要迭代的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);
    }
}
当我们点击
i=2
时,我们正确地删除了
4
。但是,在下一次迭代(
i=3
)中,arrayList现在看起来像:

1, 3, 6, 7, 8
因此,我们正在检查
7
,而不是
6
。通过删除一个元素并向前移动
i
,我们实际上跳过了对元素的检查

您的代码正在执行类似的操作,并且遇到了类似的问题。您可以通过使用内置函数(如
removeAll
)简化代码并纠正问题:

playerOneInputArray.removeAll(playerTwoInputArray);
这将从
playerInputArray
中删除重复项,但如果要对
playerWoInputArray
执行此操作,则必须对其进行一点更改,因为一旦从第一个arrayList中删除了重复项,就记不起删除了哪些重复项。如果是这种情况,请考虑:

ArrayList<Character> duplicates = new ArrayList<Character>(playerOneInputArray);
duplicates.retainAll(playerTwoInputArray);
playerOneInputArray.removeAll(duplicates);
playerTwoInputArray.removeAll(duplicates);
ArrayList duplicates=新的ArrayList(PlayerInputArray);
副本。保留(playerTwoInputArray);
PlayerInputArray.removeAll(重复);
PlayerWOInputArray.removeAll(重复);

问题在于您正在同时修改数据结构。具体地说,您正在编辑要迭代的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);
    }
}
当我们点击
i=2
时,我们正确地删除了
4
。但是,在下一次迭代(
i=3
)中,arrayList现在看起来像:

1, 3, 6, 7, 8
因此,我们正在检查
7
,而不是
6
。通过删除一个元素并向前移动
i
,我们实际上跳过了对元素的检查

您的代码正在执行类似的操作,并且遇到了类似的问题。您可以通过使用内置函数(如
removeAll
)简化代码并纠正问题:

playerOneInputArray.removeAll(playerTwoInputArray);
这将从
playerInputArray
中删除重复项,但如果要对
playerWoInputArray
执行此操作,则必须对其进行一点更改,因为一旦从第一个arrayList中删除了重复项,就记不起删除了哪些重复项。如果是这种情况,请考虑:

ArrayList<Character> duplicates = new ArrayList<Character>(playerOneInputArray);
duplicates.retainAll(playerTwoInputArray);
playerOneInputArray.removeAll(duplicates);
playerTwoInputArray.removeAll(duplicates);
ArrayList duplicates=新的ArrayList(PlayerInputArray);
副本。保留(playerTwoInputArray);
PlayerInputArray.removeAll(重复);
PlayerWOInputArray.removeAll(重复);

问题在于您正在同时修改数据结构。具体地说,您正在编辑要迭代的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);
    }
}
当我们点击
i=2
时,我们正确地删除了
4
。但是,在下一次迭代(
i=3
)中,arrayList现在看起来像:

1, 3, 6, 7, 8
因此,我们正在检查
7
,而不是
6
。通过删除一个元素并向前移动
i
,我们实际上跳过了对元素的检查

您的代码正在执行类似的操作,并且遇到了类似的问题。您可以通过使用内置函数(如
removeAll
)简化代码并纠正问题:

playerOneInputArray.removeAll(playerTwoInputArray);
这将从
playerInputArray
中删除重复项,但如果要对
playerWoInputArray
执行此操作,则必须对其进行一点更改,因为一旦从第一个arrayList中删除了重复项,就记不起删除了哪些重复项。如果是这种情况,请考虑:

ArrayList<Character> duplicates = new ArrayList<Character>(playerOneInputArray);
duplicates.retainAll(playerTwoInputArray);
playerOneInputArray.removeAll(duplicates);
playerTwoInputArray.removeAll(duplicates);
ArrayList duplicates=新的ArrayList(PlayerInputArray);
副本。保留(playerTwoInputArray);
PlayerInputArray.removeAll(重复);
PlayerWOInputArray.removeAll(重复);

您的问题是在循环中修改了
playerInputArray
。您的代码无法按预期工作,因为当您执行
remove()
时,
playerInputArray.size()
会发生变化。因此,我建议使用
removeAll(playerTwoInputArray)
而不是在循环中删除。

您的问题是在循环中修改
playerInputArray
。你的代码