[英]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,如本線程中所討論的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.