ArrayList在for循环中使用remove方法移除元素方法介绍
作者:性子有点污 发布时间:2022-11-20 03:50:18
有时候我们需要在一个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个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层 , 但是这不影响我们之前数过的蛋糕, 而且对下面的蛋糕也不影响, 这就是原理
来源:http://blog.csdn.net/u012316120/article/details/51509066
猜你喜欢
- 在前面一篇Java Comparable和Comparator对比详解中,对于java中的排序方法进行比较和具体剖析,主要是针对 Compa
- 获取自定义菜单查询返回的结果有乱码解决方法:string Posturl = "https://api.weixin.qq.com
- 迷宫项目实现设计文档项目介绍:一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示)。你的任务是找一
- 一、MyBatis的逆向⼯程(1)所谓的逆向⼯程是:根据数据库表逆向⽣成Java的pojo类,SqlMapper.xml⽂件,以及Mappe
- 一、Optional类的来源到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公
- properties和yml的区别这几天刚好看到Spring Boot当中有两种配置文件的方式,但是这两种配置方式有什么区别呢?proper
- Maven 错误找不到符号问题,通常有三种原因: 1. 可能项目编码格式不统一。 2. 可能项目编码使用的JDK版本不统一。 3
- 谈到多线程就不得不谈到Synchronized,重要性不言而喻,今天主要谈谈Synchronized的实现原理。Synchronizedsy
- 前言Spring5带来了新的响应式web开发框架WebFlux,同时,也引入了新的HttpClient框架WebClient。WebClie
- 什么是Aop主要介绍springboot中aop的使用,用过Spring框架的都知道,aop是spring框架的两大核心功能之一,还有一个就
- ActiveMQ是Apache的一个开源项目,它是一个功能强劲的开源消息总线,也是一个中间件产品,它是JMS的一个实现。在介绍ActiveM
- 1.可能是缓存导致的。解决方法:清除缓存!2.全局编译可能项目依赖别的模块,别的模块修改未进行编译,这时须先对依赖模块进行编译补充知识:ID
- 大顶堆每个结点的值都大于或等于其左右孩子结点的值小顶堆每个结点的值都小于或等于其左右孩子结点的值对比图实现代码public class He
- 这篇文章主要介绍了JAVA实现账户取款和存款操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 一、获取接口请求的数据可以在Interceptor的afterCompletion中实现但是要重写RequestWrapper代码记录如下:
- 第1部分 ArrayList介绍ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于A
- Spring Boot文件上传与下载在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设
- 1. 字段取别名,和属性名保持一致映射文件<mapper namespace="com.atguigu.mybatis.ma
- 背景数据之间两两趋势比较在数据分析应用中是非常常见的应用场景,如下所示:模拟考批次班级学生语文数学英语202302三年一班张小明130145
- 前言上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了解过数据库的同学应该会知道,