ArrayList在for循环中使用remove方法移除元素
来源:互联网 发布:霍去病的小说知乎 编辑:程序博客网 时间:2024/05/09 21:22
有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码
List<Integer> list = new ArrayList<Integer>();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 对应的数字:0i的值:1 对应的数字:1i的值:2 对应的数字:2i的值:3 对应的数字:3i的值:4 对应的数字:4i的值:5 对应的数字:5i的值:6 对应的数字:6i的值:7 对应的数字:7没有remove前list的项:8i的值:0 对应的数字:0i的值:1 对应的数字:1i的值:2 对应的数字:2i的值:3 对应的数字:3i的值:4 对应的数字:5i的值:5 对应的数字:6i的值:6 对应的数字:7remove后list的项:7==========remove后的list==========i的值:0 对应的数字:0i的值:1 对应的数字:1i的值:2 对应的数字:2i的值:3 对应的数字:4i的值:4 对应的数字:5i的值:5 对应的数字:6i的值:6 对应的数字:7
可以看到没有删除前, 我们的list的项和循环对应的数字都是正确的, 但是下面的循环在删除第4个元素后,第4,5,6个项对应的数字本应该是4,5,6, 但是这里却变成了5,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<Integer> list = new ArrayList<Integer>();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 对应的数字:0i的值:1 对应的数字:1i的值:2 对应的数字:2i的值:3 对应的数字:3i的值:4 对应的数字:4i的值:5 对应的数字:5i的值:6 对应的数字:6i的值:7 对应的数字:7没有remove前list的项:8i的值 7 对应的数字 7i的值 6 对应的数字 6i的值 5 对应的数字 5i的值 4 对应的数字 4i的值 3 对应的数字 3i的值 2 对应的数字 2i的值 1 对应的数字 1i的值 0 对应的数字 0remove后list的项:7==========remove后的list==========i的值 0 对应的数字 0i的值 1 对应的数字 1i的值 2 对应的数字 2i的值 3 对应的数字 4i的值 4 对应的数字 5i的值 5 对应的数字 6i的值 6 对应的数字 7
我们可以看到变循环变删除,并不影响后面的元素, remove后的list也和第一次的结果是一样的 . 这是因为我们删除list元素,list的长度是会变小, 但是变化的只是比当前被删除元素的项大的项, 而我们这里使用倒序循环, 大的项, 我们已经执行过了, 所以不会影响.. 再用上面的比喻来说明,这次我们是从上往下数,数到第4个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层 , 但是这不影响我们之前数过的蛋糕, 而且对下面的蛋糕也不影响, 这就是原理
0 0
- ArrayList在for循环中使用remove方法移除元素
- 注意在使用ArrayList进行for循环遍历的时候不能直接移除下标
- 增强for循环在移除元素时ConcurrentModificationException
- for循环中移除元素的空指针坑
- ArrayList for循环remove元素 , 没有抛出异常
- java中在for循环中remove元素时的陷阱
- 为什么不能在ArrayList的For-Each循环中删除元素
- Remove Element 移除元素
- 使用Set移除List中相同元素方法
- 关于JAVA中使用remove方法循环删除list中元素的常见误区
- jquery中如何移除元素-remove(),empty(),detach()
- 移除ArrayList集合中重复的元素
- Java循环中remove方法的使用
- 【源码解读】从ArrayList.class中解读为什么foreach中不能移除ArrayList元素
- List循环移除元素
- for循环删除(ArrayList.remove)及改进方法及对象在内存中的理解
- for循环删除(ArrayList.remove)及改进方法及对象在内存中的理解
- 移除元素方法
- 四、MyBatis主配置文件
- RA, 寄存器分配
- WineBottler:让苹果Mac OS照样用IE浏览器
- p96验证
- Android API DEMO:简单手绘游戏
- ArrayList在for循环中使用remove方法移除元素
- 免费馅饼
- leetcode 349:两个数组的交集I
- Linux进程学习---基本概念
- Java开发和运行环境的搭建
- allowBackup
- 在Android运行cocos Demo游戏
- Win7 outlook2010无法启动问题
- 【深入浅出Node.js系列五】初探Node.js的异步I/O实现