ArrayList在for循环中使用remove方法移除元素方法介绍
有时候我们需要在一个ArrayList的for循环中动态删除元素的需求,废话不多说看代码
Listlist=newArrayList (); 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(inti=0;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可以看到没有删除前,我们的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)实现.但是这里我们有更好的方法,就是倒序删除
还是上面的例子,我们看代码:
Listlist=newArrayList (); 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(inti=0;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(inti=0;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我们可以看到变循环变删除,并不影响后面的元素,remove后的list也和第一次的结果是一样的.这是因为我们删除list元素,list的长度是会变小,但是变化的只是比当前被删除元素的项大的项,而我们这里使用倒序循环,大的项,我们已经执行过了,所以不会影响..再用上面的比喻来说明,这次我们是从上往下数,数到第4个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层,但是这不影响我们之前数过的蛋糕,而且对下面的蛋糕也不影响,这就是原理
总结
以上就是本文关于ArrayList在for循环中使用remove方法移除元素方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:Java实现跳跃表(skiplist)的简单实例 Java多线程ForkJoinPool实例详解 等。感谢朋友们对毛票票网站的支持。有什么问题或者想要了解的可以随时给我们留言,小编会及时回复大家的。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。