[英]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.