有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码
List list = new ArrayList();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
//正常循环
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
}
System.out.println("没有remove前list的项:"+list.size());
//边循环边删除
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
if(list.get(i) == 3) list.remove(list.get(i));//删除list的第四项
}
System.out.println("remove后list的项:"+list.size());
System.out.println("==========remove后的list==========");
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
}
i的值:0 对应的数字:0
i的值:1 对应的数字:1
i的值:2 对应的数字:2
i的值:3 对应的数字:3
i的值:4 对应的数字:4
i的值:5 对应的数字:5
i的值:6 对应的数字:6
i的值:7 对应的数字:7
没有remove前list的项:8
i的值:0 对应的数字:0
i的值:1 对应的数字:1
i的值:2 对应的数字:2
i的值:3 对应的数字:3
i的值:4 对应的数字:5
i的值:5 对应的数字:6
i的值:6 对应的数字:7
remove后list的项:7
==========remove后的list==========
i的值:0 对应的数字:0
i的值:1 对应的数字:1
i的值:2 对应的数字:2
i的值:3 对应的数字:4
i的值:4 对应的数字:5
i的值:5 对应的数字:6
i的值:6 对应的数字:7
原因是,我们删除第4项后,list的长度就变成7,而且,list会把第4项后面的值往前移一位, 也就是说,i=3时,list.get(i)=4,i=4时,list.get(i)=5,i=5时,list.get(i)=6,i=6时,list.get(i)=7.. 我们再说的形象一点, 就是本来有8层糕点,依次是0-7,竖起来,大的在上,小的在下,我们从下往上数,数到第5个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层
所以, 值为4的项我们根本没有循环到
那有什么方法可以实现remove呢, 有个笨方法,是新建一个tempList, 把要删除的项全部add进去,最后用list.removeAll(tempList)实现 . 但是这里我们有更好的方法, 就是倒序删除
还是上面的例子, 我们看代码:
List list = new ArrayList();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
//正常循环
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
}
System.out.println("没有remove前list的项:"+list.size());
//边循环边删除
for (int i = list.size() -1 ; i >= 0; i--) {
System.out.println("i的值 " + i + " 对应的数字 " + list.get(i));
if(list.get(i) == 3) list.remove(list.get(i));
}
System.out.println("remove后list的项:"+list.size());
System.out.println("==========remove后的list==========");
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值 " + i + " 对应的数字 " + list.get(i));
}
i的值:0 对应的数字:0
i的值:1 对应的数字:1
i的值:2 对应的数字:2
i的值:3 对应的数字:3
i的值:4 对应的数字:4
i的值:5 对应的数字:5
i的值:6 对应的数字:6
i的值:7 对应的数字:7
没有remove前list的项:8
i的值 7 对应的数字 7
i的值 6 对应的数字 6
i的值 5 对应的数字 5
i的值 4 对应的数字 4
i的值 3 对应的数字 3
i的值 2 对应的数字 2
i的值 1 对应的数字 1
i的值 0 对应的数字 0
remove后list的项:7
==========remove后的list==========
i的值 0 对应的数字 0
i的值 1 对应的数字 1
i的值 2 对应的数字 2
i的值 3 对应的数字 4
i的值 4 对应的数字 5
i的值 5 对应的数字 6
i的值 6 对应的数字 7