【Java语言】遍历List元素时删除集合中的元素

目录

前言

实现方式

1.普通实现

1.1 使用【for循环】 方式

1.2 使用【迭代器】方式

2.jdk1.8新增功能实现

2.1 使用【lambda表达式】方式

2.2 使用【stream流】方式

注意事项

1. 使用【for循环】 方式

2. 不能使用增强for遍历修改元素

总结


前言

        分享几种从List中移除元素的常用方法,【注意事项】尤其重要,很容易踩坑。


实现方式

场景:移除List集合中所有的偶数。 

1.普通实现

1.1 使用【for循环】 方式

  • 代码示例如下:
    /*** 使用【for循环】在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod6(List<Integer> list) {for (int i = list.size() - 1; i >= 0; i--) {Integer integer = list.get(i);if (0 == integer % 2) {list.remove(i);}}return list;}

1.2 使用【迭代器】方式

  • while循环】代码示例如下:
    /*** 使用迭代器在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod(List<Integer> list) {Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {Integer integer = iterator.next();if (0 == integer % 2) {iterator.remove();}}return list;}
  • for循环】代码示例如下:
  /*** 使用【增强for】在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod2(List<Integer> list) {for (Iterator iterator = list.iterator(); iterator.hasNext();) {Integer integer = (Integer) iterator.next();if (0 == integer % 2) {iterator.remove();}}return list;}

2.jdk1.8新增功能实现

2.1 使用【lambda表达式】方式

  • 代码示例如下:
    /*** 使用【lambda表达式】移除元素* @param list* @return*/public static List<Integer> removeMethod3(List<Integer> list) {list.removeIf(integer -> 0 == integer % 2);return list;}

2.2 使用【stream流】方式

  • 代码示例如下: 
    /*** 使用【stream流】移除元素* @param list* @return*/public static List<Integer> removeMethod4(List<Integer> list) {list = list.stream().filter(integer -> 0 == integer % 2).collect(Collectors.toList());return list;}

注意事项

1. 使用【for循环】 方式

在1.1中,为什么要从集合的最后往前遍历呢? 

        因为List底层是一个动态数组,从数组中移除一个非末尾的元素,该元素后面的元素都会动态的往前移动。如果从前往后遍历,那每移除一个元素,当前索引的元素就会发生改变,会导致有些元素遍历不到,影响结果的正确性。 例如:

package com.zhy.coll;import java.util.ArrayList;
import java.util.List;public class TestList {/*** 初始化List集合* @return*/public static List<Integer> initList(List<Integer> list){for(int i = 0; i < 10; i++) {Integer integer = (int)(Math.random() * 100);list.add(integer);}return list;}/*** 使用迭代器在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod5(List<Integer> list) {for (int i = 0; i < list.size(); i++) {Integer integer = list.get(i);if (0 == integer % 2) {list.remove(i);}}return list;}public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();initList(list);List<Integer> list2 = new ArrayList<Integer>();list2.addAll(list);System.out.println("初始化集合:\n\t" + list2);//方式五list2.clear();list2.addAll(list);System.out.println("使用【for循环】从前往后遍历数组,并移除集合中所有的偶数:\n\t" + removeMethod5(list2));}
}

输出结果:发现并没有正确移除集合中所有的偶数。

注:所以使用这种方式的话,一定要特别注意,用倒序遍历索引的方式。 

2. 不能使用增强for遍历修改元素

增强for只能遍历集合元素,不能对集合元素个数进行修改(包括增加和删除)会编译报错


总结

        使用普通实现方式,一目了然,但是代码行数比较多;使用1.8新增功能实现,代码就会简洁,但是在团队配合开发的场景中,如果没有了解过1.8新增特性的,可能可读性不强。方式各有优劣势,根据需求择优选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/536589.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS操作系统学习——任务通知

任务通知介绍 所谓任务通知&#xff0c;也可以反过来通知任务。在以往使用队列&#xff0c;信号量&#xff0c;事件组等等方法时&#xff0c;我们并不知道对方是谁&#xff0c;而在使用任务通知时&#xff0c;可以明确指定通知哪个任务。使用任务通知时&#xff0c;任务结构体…

程序员的三重境界:码农,高级码农、程序员!

见字如面&#xff0c;我是军哥&#xff01; 掐指一算&#xff0c;我在 IT 行业摸爬滚打 19 年了&#xff0c;见过的程序员至少大好几千&#xff0c;然后真正能称上程序员不到 10% &#xff0c;绝大部分都是高级码农而已。 今天和你聊聊程序员的三个境界的差异&#xff0c;文章不…

未来已来:科技驱动的教育变革

我们的基础教育数百年来一成不变。学生们齐聚在一个物理空间&#xff0c;听老师现场授课。每节课时长和节奏几乎一致&#xff0c;严格按照课表进行。老师就像“讲台上的圣人”。这种模式千篇一律&#xff0c;并不适用于所有人。学生遇到不懂的问题&#xff0c;只能自己摸索或者…

【数据结构】详解时间复杂度和空间复杂度的计算

一、时间复杂度&#xff08;执行的次数&#xff09; 1.1时间复杂度的概念 1.2时间复杂度的表示方法 1.3算法复杂度的几种情况 1.4简单时间复杂度的计算 例一 例二 例三 1.5复杂时间复杂度的计算 例一&#xff1a;未优化冒泡排序时间复杂度 例二&#xff1a;经过优化…

JAVA初阶数据结构链表(2)双向链表( +专栏数据结构练习是完整版)

1.双向链表的结构&#xff08;双向不带头不循环链表&#xff09; 需要注意的一点就是&#xff0c;在jdk中的链表就是双向链表 一个节点有三个域 val&#xff08;数值域&#xff09; next&#xff08;地址域&#xff09; prev&#xff08;前驱记录前一个节点的地址&#xff09…

Express学习(四)

使用Express写接口 创建基本的服务器 创建API路由模块 编写GET接口 编写POST接口 CORS跨域资源共享 什么是CORS CORS由一系列HTTP响应头组成&#xff0c;这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如…

yum安装mysql 数据库tab自动补全

centos7上面没有mysql&#xff0c;它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

Three.js点线几何空间图形代码

Three.js点线几何空间图形代码。效果如下 下载地址 Three.js点线几何空间图形代码

docker部署springboot jar包项目

docker部署springboot jar包项目 前提&#xff0c;服务器环境是docker环境&#xff0c;如果服务器没有安装docker&#xff0c;可以先安装docker环境。 各个环境安装docker&#xff1a; Ubuntu上安装Docker&#xff1a; ubuntu离线安装docker: CentOS7离线安装Docker&#xff1…

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习&#xff1a;计时和文件处理-给算法计时-上机代码 上机代码&#xff1a; # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…

【论文阅读】Natural Adversarial Examples 自然对抗的例子

文章目录 一、文章概览&#xff08;一&#xff09;摘要&#xff08;二&#xff09;导论&#xff08;三&#xff09;相关工作 二、IMAGENET-A 和 IMAGENET-O&#xff08;一&#xff09;数据集构造方式&#xff08;二&#xff09;数据收集过程 三、模型的故障模式四、实验&#x…

Docker自建蜜罐系统【失陷检测、外网威胁感知、威胁情报】

项目地址&#xff1a; https://hfish.net Hfish是一款基于Docker的网络钓鱼平台&#xff0c;它能够帮助安全团队模拟各种网络钓鱼攻击&#xff0c;以测试和提高组织的安全防御能力。 Hfish的优点 为什么选择Hfish&#xff1f; 蜜罐通常被定义为具有轻量级检测能力、低误报率…