繁体   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