簡體   English   中英

如何刪除兩個不同的ArrayLists中的兩個相同的元素?

[英]How to remove two of the same elements in two different ArrayLists?

剛開始學習Java,並對如何從兩個不同的Arraylist中刪除通用元素有疑問?

我的思考過程伴隨着:

 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

問題是您正在同時修改數據結構。 具體來說,您正在編輯要遍歷的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刪除重復playerOneInputArray ,但是如果要對playerTwoInputArray執行此操作,則必須playerTwoInputArray更改,因為一旦從第一個arrayList中刪除了重復項,您將不記得刪除了哪些重復項。 如果是這種情況,請考慮:

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

您的問題是您在循環中修改了playerOneInputArray 您的代碼playerOneInputArray.size()按預期工作,因為當您執行remove()playerOneInputArray.size()發生變化。 因此,我建議使用removeAll(playerTwoInputArray)而不是在循環中刪除。

關於您的代碼的觀察:

當第一個數組長於第二個數組時,您將遇到索引超出范圍異常。

同樣,當兩個數組的大小不同時,您也不會檢查數組之間的所有元素,因為您僅將第一個數組的大小用於循環。 這樣做也為我提到的第一個問題創造了潛力。

您需要以某種方式處理這些情況,而不是跳過某些數據或出錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM