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

标签:arraylist,for循环,remove
0
投稿

猜你喜欢

  • Java日常练习题,每天进步一点点(41)

    2023-05-18 18:10:02
  • Spring如何使用xml创建bean对象

    2023-10-24 08:53:56
  • 基于StreamRead和StreamWriter的使用(实例讲解)

    2022-09-11 22:12:36
  • java实现一次性压缩多个文件到zip中的方法示例

    2021-11-16 07:24:47
  • RegexOptions.IgnoreCase正则表达式替换,忽略大小写

    2022-05-03 17:25:45
  • logback中显示mybatis查询日志文件并写入的方法示例

    2023-11-03 03:01:48
  • Flutter有无状态类与State及生命周期详细介绍

    2022-12-27 15:48:53
  • 比较2个datatable内容是否相同的方法

    2022-11-25 08:27:04
  • 关于Springboot+gateway整合依赖并处理依赖冲突问题

    2023-10-23 21:13:56
  • Maven中怎么手动添加jar包到本地仓库详解(repository)

    2023-09-08 07:33:20
  • Android使用SQLite数据库的简单实例

    2022-03-04 13:52:50
  • 教你轻松制作java音乐播放器

    2023-09-27 11:17:11
  • Java毕业设计实战之共享租车信息管理系统的实现

    2022-08-02 13:37:32
  • C#并行编程之信号量

    2023-10-08 19:26:54
  • Log4j.properties配置及其使用

    2023-05-14 21:06:18
  • C#使用Lambda表达式简化代码的示例详解

    2022-09-16 03:03:36
  • SpringBoot参数校验的最佳实战教程

    2023-11-28 21:13:47
  • IDEA设置生成带注释的getter和setter的图文教程

    2023-06-28 00:49:36
  • 详解C#中检查null的语法糖

    2023-08-12 11:20:08
  • Android 接收微信、QQ其他应用打开第三方分享功能

    2022-06-12 18:11:58
  • asp之家 软件编程 m.aspxhome.com