簡體   English   中英

為什么不從我的ArrayList中刪除所有元素 <Integer> ?

[英]Why are not all elements removed from my ArrayList<Integer>?

我是使用Android Studio學習Android編程的新手,但是有問題。 我嘗試刪除此列表中的所有元素,但最后它的大小為5。為什么?

這是我的代碼:

ArrayList<Integer> arr = new ArrayList<Integer>(10);
for(int i=1;i<=10;i++){
    arr.add(i);
}

for(int i=0;i<arr.size();i++) {
    arr.remove(i);
}

Toast.makeText(getApplicationContext(),
    arr.size()+" ",
    Toast.LENGTH_LONG).show();

哦,你知道為什么嗎?

因為當我++它會變得更大吧? 但是每次刪除arraylist的長度都會改變。 會變小

i
0 1 2 3 4 5
arraylist size
9 8 7 6 5 4

因此,最后只刪除其中5個10-5 = 5,列表大小為5

移除循環將僅執行5次,因為每次循環迭代都會評估條件i < arr.size() ,並且arr.size()都會變小。 所以i變大了, arr.size()變小了,它們在中間相遇。

要解決此問題,請向后迭代:

for (int i = arr.size(); --i >= 0;) {
    arr.remove(i);
}

或將其更改為:

while (arr.size() > 0) {
    arr.remove(0);
}

或者,更有效地,刪除循環並調用arr.clear(); 代替。

請注意,令人困惑的是,使用int調用remove會刪除該位置的元素,而使用int調用add會將該添加為Integer 如果要刪除該 ,請調用remove((Integer)i);

這是許多新手開發人員常犯的錯誤。 我過去也這樣做過。 下面的答案解釋了原因。 按大小循環遍歷數組並刪除循環中的項目很危險。 array.clear()是最簡單的方法,但是如果需要在刪除每個元素之前進行額外的工作,則可以使用Iterators,如本線程中所討論的那樣。

在Java中的foreach循環中調用remove

暫無
暫無

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

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