ArrayList在for循环中使用remove方法移除元素方法介绍

有时候我们需要在一个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 对应的数字: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)实现 . 但是这里我们有更好的方法, 就是倒序删除

还是上面的例子, 我们看代码:

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 对应的数字: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实例详解  等。感谢朋友们对我们网站的支持。有什么问题或者想要了解的可以随时给我们留言,小编会及时回复大家的。

(0)

相关推荐

  • 关于Ext中form移除textfield方法:hide(),setVisible(false),remove()

    问题:当使用hide()方法和setvisible(false)方法去除items的中间(见过很多例子移除的都是尾部表单)表单后,原form验证无效 解决办法:使用remove(id)方法移除表单,可得到有效的form 原因:未知,希望大家补充 补充:下面是一个我遇到问题代码的简化版本,没有经过测试,大概意思是要是在form里想控制不显示表单,用remove()方法有效 复制代码 代码如下: new Ext.form.FormPanel({ id : 'ReportForm',items : [

  • ExtJS TabPanel beforeremove beforeclose使用说明

    当前系统使用Extjs做为前端框架,系统首页布局采用border方式,左边手风琴式的菜单栏,中间区域为TabPanel容器,点击左边菜单栏内的对应菜单在中间区域添加对应的Panel,Panel嵌入添加的gridview: 当前问题是,想在用户关闭时弹出对话框提示用户,根据用户选择是否销毁当前页面(Panel),或是隐藏当前Panel,保存临时数据: 查看Extjs API文档,对添加的panel监听beforeclose事件 主要代码如下 中间区域部分: 复制代码 代码如下: //centerP

  • ArrayList在for循环中使用remove方法移除元素方法介绍

    有时候我们需要在一个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++

  • ArrayList删除集合中某一属性相同的元素方法(推荐)

    如果想要集合中的元素不会有重复,那么推荐使用hashSet,如下: // list是有重复元素的ArrayList HashSet hSet = new HashSet(list); list.clear(); list.addAll(hSet); 但是有时我们想删除某一个重复属性值(值相同)的某个元素,如下: NetWork nw1 = new NetWork(); nw1.id = 1; nw1.destip = "192.168.1.3"; NetWork nw2 = new N

  • Linux Shell循环中实现展示进度百分比的实现方法

    Shell 循环中实现展示进度百分比的脚本方法 当我需要处理一个几万行的文件的时候,需要处理的时间是比较长的.我一开始的想法是,没处理一行,就输出一个 # 号.但是这样还是会出现很多很多的 # 号,即便是放在一行,也是非常不优雅的.所以,我想实现一个展示进度百分比的脚本. 实现思路 获取文件的行数 用 i++ 实现每行处理的计数 当前处理行数*100再除以文件行数+%得到我要输出的百分比结果 我需要在一行展示,而不是一直追加或者每次都显示一行 就是这些需求了.我们来逐渐实现. 获取文件的行数 这

  • Java通过在主循环中判断Boolean来停止线程的方法示例

    本文实例讲述了Java通过在主循环中判断Boolean来停止线程的方法.分享给大家供大家参考,具体如下: package Threads; /** * Created by Frank */ public class StopBoolean extends Thread { // 确保变化对其它线程可见(主要是主线程要可见) protected volatile boolean done = false; public void run() { while (!done) { System.ou

  • JQuery中DOM实现事件移除的方法

    本文实例讲述了JQuery中DOM实现事件移除的方法.分享给大家供大家参考.具体如下: 可以为同一个元素绑定多个事件,也可以为多个元素绑定同一个事件.假设网页上有一个<button>元素,使用以下代码为该元素绑定多个相同的事件. $(function(){ $('#btn').bind("click", function(){ $('#test').append("<p>我的绑定函数1</p>"); }).bind("c

  • 浅析jquery unbind()方法移除元素绑定的事件

    unbind()方法可以移除元素已绑定的事件,它的调用格式如下: $(selector).unbind(event,fun) 其中参数event表示需要移除的事件名称,多个事件名用空格隔开,fun参数为事件执行时调用的函数名称. 语法  unbind()函数主要有以下两种形式的用法: 用法一: jQueryObject.unbind( [ events [, handler ]] ) 移除当前匹配元素的events事件绑定的事件处理函数handler. 用法二: jQueryObject.unb

  • Java Collection 移除元素方法及注意事项

    1. 前言 操作集合是一个 Java 编程人员几乎每天都在重复的事情.今天我们来研究一下从 Java Collection 中删除元素的方法.我构建了一个简单的集合,我们以此为例子来展开探索. List<String> servers = new ArrayList<>(); servers.add("Felordcn"); servers.add("Tomcat"); servers.add("Jetty"); serv

  • Java ArrayList遍历foreach与iterator时remove的区别

    目录 一.Iterator和foreach的区别 1.为啥说foreach底层就是Iterator 二.foreach与iterator时remove的区别 1.remove操作源码分析 2.源码步骤 3.为啥都是底层都是iterator,为啥foreach会报错 三.查看源码方法 一.Iterator和foreach的区别 多态差别(foreach底层就是Iterator) Iterator是一个接口类型,他不关心集合或者数组的类型; for和foreach都需要先知道集合的类型,甚至是集合内

  • c# for循环中创建线程执行问题

    先执行以一个简单的示例: static void Main(string[] args) { List<int> taskConsumes = new List<int>() { 1,2,3,4,5}; for (int i = 0; i < taskConsumes.Count; i++) { new Task(() => { TaskMethod(taskConsumes[i]); }).Start(); } Console.ReadLine(); } public

  • python else语句在循环中的运用详解

    在学习python循环语句的时候,发现else竟然可以和循环语句使用,但是它却与if中else语句的运行完全不同,有时候你真的感觉掉进这个else陷阱里了,完全不知道该怎么用,那么现在咱们一起去看看吧 一.循环_else示例 1.while_else的运用 # 定义外循环计数器 i = 1 # 循环1-10每个数字 while i <= 10: # 定义内循环计数器 j = 1 # 循环1-5每个数字,或者说循环5次 while j <= 5: # 判断1-10之间的数/2是否有余数 if i

随机推荐