【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新增特性的,可能可读性不强。方式各有优劣势,根据需求择优选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序语言设计

一、程序设计语言及其构成 1.程序设计语言 2.高级程序设计语言划分 3.常见的高级程序语言 4.标记语言 5.程序设计语言的构成 二、表达式 表达式的类型及转换规则 三、传值和传址调用 1.数据类型 2.传值和传址调用 四、语言处理程序 1.语言处理程序 语言处理程序&#xff1…

【JS】浅谈浅拷贝与深拷贝

浅拷贝与深拷贝 前言一、浅拷贝&#xff1f;1.1是什么&#xff1f;1.2做什么&#xff1f;1.3为什么使用&#xff1f;1.4实现方式&#xff1f;1.5 应用场景&#xff1f; 二、深拷贝&#xff1f;2.1是什么&#xff1f;2.2做什么&#xff1f;2.3为什么使用&#xff1f;2.4实现方式…

成都产业园排名出炉!金牛区这个园区成数字产业聚集地

近日&#xff0c;成都产业园排名榜单正式发布&#xff0c;可以看出金牛区成数字产业聚集地&#xff0c;其中&#xff0c;备受瞩目的国际数字影像产业园荣登榜首。这一排名不仅彰显了国际数字影像产业园在数字产业领域的卓越表现&#xff0c;更凸显了成都作为西部重要城市在科技…

51单片机系列-单片机定时器

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 软件延时的缺点 延时过程中&#xff0c;CPU时间被占用&#xff0c;无法进行其他任务&#xff0c;导致系统效率降低&#xff0c;延时时间越长&#xff0c;该缺点就越明显&…

HBuilder发行微信小程序

首先需要完善mainifest.json中的基本配置 这个需要组测dcloud才可以获取&#xff0c;注册后点击重新获取就可以。 然后发行前还需要完成dcloud的信息&#xff0c;这个他会给你网址 点击连接完成信息填写就可以了 然后就可以发行了。 发行成功后会自动跳转微信小程序&#xff…

day02vue学习

day02 一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 &#xff08;演示&#xff09; 渲染 / 删除 / 修…

Flutter第四弹:Flutter图形渲染性能

目标&#xff1a; 1&#xff09;Flutter图形渲染性能能够媲美原生&#xff1f; 2&#xff09;Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia。 Flutter不使用WebView&#xff0c;也不使用操作系统的原生控件,而是…

如何深度学习

信息爆炸时代&#xff0c;诞生了很多新的学习方式&#xff0c;非常轻松就能掌握知识&#xff0c;比如&#xff0c;每天听一本书&#xff0c;半个小时就能学习一本书的精华&#xff0c;比如订阅名家专栏或者课程&#xff0c;在不长的时间内内就能学到很多知识。 很多人认为这样…

jenkins 使用k8s插件连接k8s集群

jenkins 安装k8s 插件 配置k8s节点 填写k8s 配置信息 生成秘钥 在服务器上面 查看地址 Kubernetes 服务证书 key cat /root/..kube/config 查看秘钥 对秘钥进行base64 位 加密 echo "秘钥内容" | base64 -d -----BEGIN CERTIFICATE----- MIIDITCCAgmgAwIB…

【node】模块化与包(二)

1、模块化的基本概念 模块化是指解决一个复杂的问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 &#xff08;1&#xff09;模块化的优点 遵循固定规则&#xff0c;把大文件拆分成对立并相互依赖…

【Axure高保真原型】下拉列表切换图表

今天和大家分享通过下拉列表动态切换统计图表的原型模板&#xff0c;我们可以通过下拉列表选择要显示的图表&#xff0c;包括柱状图、条形图、饼图、环形图、折线图、曲线图、面积图、阶梯图、雷达图&#xff1b;而且图表数据可以在左侧表格中动态维护&#xff0c;包括增加修改…

数码管的动态显示(二)

1.原理 这个十六进制是右边的dp为高位。 数码管的动态显示&#xff0c;在第一个计数周期显示个位&#xff0c;在第二个周期显示十位&#xff0c;在第三个周期显示百位由于人眼的视觉和数码管的特性&#xff0c;感觉就是显示了234&#xff0c;每个数码管的显示需要从输入的数据里…

科普编程中 宿主环境(host environment) 基础概念

我们来说说 宿主环境 首先 什么是宿主环境&#xff1f; 宿主环境 (host environment) 意思就是 程序运行所必须的依赖环境 安卓和IOS 系统 就是两种完全不同的宿主环境 总所周知 微信版的安卓App 在苹果中是无法运行的 所以说 Android 是安卓软件的宿主环境 离开了这个宿主环…

ECharts饼图图例消失踩的坑

在使用Echarts的饼图时&#xff0c;当时做法是在图例数小于8时显示全部的图例&#xff0c;在大于8的时候显示前8个图例。于是用了两种不同的方式处理。导致出现切换时间后图例不显示的情况。 错误过程&#xff1a; 在进行图例生成时采用了两种不同的方式&#xff1a; ①如果…

Linux内核编译(版本6.0以及版本v0.01)并用qemu驱动

系统环境&#xff1a; ubuntu-22.04.1-desktop-amd64 目标平台: x86 i386 内核版本: linux-6.0.1 linux-0.0.1 环境配置 修改root密码 sudo passwd 修改软件源&#xff08;非必要&#xff09; vmtools安装&#xff08;实现win-linux软件互传&#xff09; 安装一些必须的软件&…

代码随想录算法训练营第25天|216.组和总和三、17.电话号码的字母组合

目录 一、力扣216.组合总和三1.1 题目1.2 思路1.3 代码 二、力扣17.电话号码的字母组合2.1 题目2.2 思路2.3 代码 一、力扣216.组合总和三 1.1 题目 1.2 思路 自己的想法&#xff1a;和总和问题思路类似&#xff0c;回溯法。 &#xff08;1&#xff09;k个数的组合&#xff0…

如何查看mnist数据集的图片

import numpy as np import matplotlib.pyplot as pltdef read_mnist_images(filename):with open(filename, rb) as f:# 读取魔术数字、图像数量、行数、列数magic_number int.from_bytes(f.read(4), big)number_of_images int.from_bytes(f.read(4), big)rows int.from_by…

《详解:鸿蒙NEXT开发核心技术》

我们现在都知道鸿蒙作为一个国产的全栈自研系统&#xff0c;经过国家主推后。已经引起人们很大的关注&#xff0c;其中作为开发者来说&#xff1b;许多一线大厂已经与其华为鸿蒙展开原生应用的合作了&#xff0c;目前了解到已经有200家。而之后出现了很多的高薪鸿蒙开发岗位&am…

ThreeJs 射线拾取不准确设置

欢迎关注进来点个关注; 关注获取更多咨询!关注获取答案! 1、效果图如下: 2、问题描述:点击一开始无法获取当前的位置,官方推荐直接使用 mouseClick.x = (event.offsetX / window.innderWidth) * 2 - 1; mouseClick.y = -(event.offsetY / window.innderHeight) * 2 + 1;…

独显直连是什么意思

很多小伙伴在购买笔记本电脑时&#xff0c;尤其是游戏本&#xff0c;都会看到详情页在介绍显卡提示有“独显直连”功能&#xff0c;那么独显直连是什么意思&#xff1f;它又有什么用呢&#xff1f; 独显直连是什么意思 独显直连&#xff0c;英文全称Graphics Processing Unit…