当前位置: 首页 > news >正文

数组边遍历(for循环)边删除为什么删不干净 及三种实现删除的方法

文章目录

  • 1、为什么删不干净
  • 倒序删
  • 迭代器
  • lambda表达式删除

为什么说数组边for循环遍历边删除会出现删不干净的情况

1、为什么删不干净

先写一个例子:可以先猜一下控制台会打印出什么内容?

public class removeIterator {public static void main(String[] args) {//ArrayList的底层数据结构就是数组List<String>list=new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");for(int i=0;i<list.size();i++){list.remove(i);}System.out.println(list.toString());}
}

公布答案:
在这里插入图片描述
可以看到,并没有全部移除掉(猜对没?)。那这是为什么呢?

一开始,list中是这样的:
在这里插入图片描述

当移除下标为0的元素后,index+1=1,而元素bbb及之后的元素都向前移动了一位,如下图:
在这里插入图片描述
接下来要移除index==1位置上的元素,也就是移除ccc,移除ccc后,ddd的下标变为1,而index+1=2,即不会移除ddd,所以最后list剩下了bbb和ddd:
在这里插入图片描述

那么如何才可以稳定的删除呢,总结了以下三种方法:

倒序删

倒序删不会出现上面例子中元素数组位置改变的情况。

public class removeIterator {public static void main(String[] args) {List<String>list=new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");for(int i=list.size()-1;i>=0;i--){list.remove(i);}System.out.println(list.toString());}
}

结果:
在这里插入图片描述

迭代器

使用 Iterator.remove() 方法
简单介绍一下这个方法:

  1. Collection接口实现了Iterable接口,实现了Iterable接口的类可以拥有增强for循环
  2. Iterator的remove()方法优势
    如果知道删除项的准确位置,删除操作的开销小
    不能对正在被遍历的集合进行改变(add,remove,clear等操作),但是可以调用iterator中的remove方法进行删除
public class removeIterator {public static void main(String[] args) {List<String>list=new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");Iterator<String> it = list.iterator();while(it.hasNext()){it.next();it.remove();}System.out.println(list.toString());}
}-----结果-----
[]

注:如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,再调用remove都会报IllegalStateException。

lambda表达式删除

上面使用迭代器的方式虽然能够正常的删除列表中的元素,但是不够优雅,因为要写好几行的遍历代码,显得略臃肿。能不能只用一行代码完成这个功能呢?答案是可以的——使用Lambda表达式:
删除指定条件的元素:

  public String getString(List<Integer> list) {if (list == null || list.isEmpty()) {return null;}list.removeIf(e -> isNotValid(e));return list.stream().map(String::valueOf).collect(Collectors.joining(","));}private static Boolean isNotValid(Integer in) {if (in == null) {//为空的为无效数字return true;}return false;}
//输入:[1,2,3,null,5,null,7]
//输出:"1,2,3,5,7"

相关文章:

数组边遍历(for循环)边删除为什么删不干净 及三种实现删除的方法

文章目录1、为什么删不干净倒序删迭代器lambda表达式删除为什么说数组边for循环遍历边删除会出现删不干净的情况1、为什么删不干净 先写一个例子&#xff1a;可以先猜一下控制台会打印出什么内容&#xff1f; public class removeIterator {public static void main(String[]…...

环境配置之Keepass

前言很久以前&#xff0c;就有了想要一个自己密码管理器的念头。毕竟&#xff0c;即使浏览器能记住各个网站的账号密码&#xff0c;但是在登录单独客户端的时候&#xff0c;仍然要翻找密码。为了省事&#xff0c;也曾经是一个密码走天下。然后被劫持了QQ给同学发黄色小网站&…...

Java 电话号码的组合

电话号码的字母组合中等给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。示例 1&#xff1a;输入&#xff1a;digits "23…...

MATLAB——将直接型转化为并联型和级联型

题目1(IIR)&#xff1a; 已知一个系统的传递函数为&#xff1a; H&#xff08;z&#xff09;8−4z−111z−2−2z−31−1.25z−10.75z−2−0.125z−3H&#xff08;z&#xff09;\frac{8-4z^{-1}11z^{-2}-2z^{-3}}{1-1.25z^{-1}0.75z^{-2}-0.125z^{-3}}H&#xff08;z&#xff09…...

.NET Framework .NET Core与 .NET 的区别

我们在创建C#程序时,经常会看到目标框架以下的选项,那么究竟有什么区别? 首先 .NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、Web API和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows WPF、Windows窗体…...

carla与ros2的自动驾驶算法-planning与control算法开发与仿真

欢迎仪式 carla与ros2的自动驾驶算法-planning与control算法开发与仿真欢迎大家来到自动驾驶Player(L5Player)的自动驾驶算法与仿真空间&#xff0c;在这个空间我们将一起完成这些事情&#xff1a; 控制算法构建基础模块并仿真调试&#xff1a;PID、LQR、Stanley 、MPC、滑膜控…...

corn表达式

简单理解corn表达式&#xff1a;在使用定时调度任务的时候&#xff0c;我们最常用的&#xff0c;就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。cron表达式配置起来简洁方便&#xff0c;无论是Spring的Scheduled还是用Quartz框架&#xff0c;都支持…...

推荐系统中对抗性机器学习-文献综述与未来发展整理分享

对抗学习是一种机器学习技术&#xff0c;旨在通过提供欺骗性输入来欺骗模型。最常见的原因是导致机器学习模型出现故障。大多数机器学习技术旨在处理特定的问题集&#xff0c;其中从相同的统计分布&#xff08;IID&#xff09;生成训练和测试数据。当这些模型应用于现实世界时&…...

Proteus8.15安装教程

1、解压Proteus8.15 安装包&#xff0c;然后双击进去&#xff0c;找到setup文件&#xff0c;右键&#xff0c;以管理员身份运行。 2、需要安装一些插件&#xff0c;点击“next”。把插件安装完成。 点击“finfish” 点击“install” 点击“Cancel” 3、如果没有上面步骤&…...

Shell 基本运算符

Shell 和其他编程语言一样&#xff0c;支持多种运算符&#xff0c;包括&#xff1a; 算数运算符关系运算符布尔运算符字符串运算符文件测试运算符 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk 和 expr&#xff0c;expr 最常用。…...

Linux基础命令-sed流编辑器

Linux三剑客-grep命令 Sed 一. 命令介绍 先到帮助文档中查看命令的描述信息 NAME sed - stream editor for filtering and transforming text sed命令是操作、过滤和转换文本内容的强大工具&#xff0c;常用功能包括结合正则表达式对文件实现快速增删改查&#xff0c;其中查询…...

C语言笔试题(1)

#include <stdio.h> #include <stdlib.h> #include <string.h> void getmemory(char *p) { p(char *) malloc(100); strcpy(p,“hello world”); } int main(void) { char *strNULL; getmemory(str); printf(“%s/n”,str); free(str); return 0; } 上述程序…...

网络连接的三种模式

文章目录前言一、三种连接模式介绍二、三种网络连接模式的区别前言 在进行虚拟机配置时&#xff0c;网络连接分为三种模式&#xff1a;桥接模式&#xff0c;NAT模式&#xff0c;主机模式 一、三种连接模式介绍 张三、李四、王五在同一个网段&#xff0c;所以他们之间可以相互…...

大学模拟电路期末考试模拟题详解

&#xff08;一&#xff09;选择题 3.4.5.6.7.8.9.10. &#xff08;二&#xff09;填空题 1.漂流电流是温度电流&#xff0c;它由少数、载流子形成、其大小与温度有关&#xff0c;而与外加电压无关。 反向电流是由少数载流子形成、其大小与温度有关&#xff0c;而与外加电压无…...

C/C++内存管理讲解

c/C内存管理讲解 C/C内存分布 首先通过一些题目的引入讲解带大家走进C/C的内存分布。 eg1&#xff1a; 根据上述变量的定义&#xff0c;来判断它们所在的内存位置。 从接下来的4个选项中选出最佳答案填入&#xff08;注&#xff1a;可重复选&#xff09;。 A、栈 B、堆 C、数…...

【Linux】网络原理

本篇博客让我们一起来了解一下网络的基本原理 1.网络发展背景 关于网络发展的历史背景这种东西就不多bb了&#xff0c;网上很容易就能找到参考资料&#xff0c;我的专业性欠缺&#xff0c;文章参考意义也不大。这里只做简单说明。 网络发展经过了如下几个模式 独立模式&…...

list模拟实现

list模拟实现list原理讲解节点结构list类设计push_backIterators:begin与endconst对象的迭代器重载->运算符反向迭代器迭代器所有代码迭代器总结constructor:clear~listfront与backinsert与erasesize与empty与swappop_back()总代码:节点类正向迭代器类反向迭代器类list类lis…...

CSS看这一篇就够啦,CSS基础大全,可用于快速回顾知识,面试首选

1 CSS简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称。 CSS 是也是一种标记语言&#xff0c;主要用于设置 HTML 页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、 边距等&#xff09;以及版面的布局和外观…...

Canvas详细使用方法(一)

Canvas Canvas的注意事项 < canvas > 和 < img > 元素很相像&#xff0c;唯一的不同就是它并没有 src 和 alt 属性。 -< canvas > 标签只有两个属性——width和height( 单位默认为px )。当没有设置宽度和高度时&#xff0c;canvas 会初始化宽为 300px 和高…...

CentOS定时任务——crontab

crontab Linux crontab 是用来定期执行程序的命令。 crond 命令每分钟会定期检查是否有要执行的工作&#xff0c;如果有要执行的工作便会自动执行该工作。 注意&#xff1a;新创建的 cron 任务&#xff0c;不会马上执行&#xff0c;至少要过 2 分钟后才可以&#xff0c;当然你…...

C51---蓝牙模块---连接软件---控制LED灯

1.器件&#xff1a;C51、HC-08蓝牙模块、Ty-C数据线、杜邦线 2.软件&#xff1a;HC蓝牙助手 3.接线&#xff1a;VCC-VCC、GND-GND、RXD-TXD、TXD-RXD 4.烧写&#xff1a;STC-ISP串口助手 5.代码&#xff1a; #include "reg52.h" #include "intrins.h" …...

Linux 学习笔记——二、主机规划与磁盘分区

一、Linux 与硬件的搭配 Linux 中所有设备均被视为文件&#xff0c;其命名规则如下&#xff1a; 设备文件名SCSI/SATA/USB 硬盘机/dev/sd[a-p]USB 闪存盘/dev/sd[a-p]&#xff08;与 SATA 相同&#xff09;Virtl/O 界面/dev/vd[a-p]&#xff08;用于虚拟机内&#xff09;软盘…...

麒麟服务器V10 版本 安装 Anaconda教程,也就是安装Python环境的教程(亲测有效)

目录1 Anaconda 是什么2 安装1 Anaconda 是什么 你可以理解为一个软件&#xff0c;和QQ一样的软件&#xff0c;你安装之后&#xff0c;里面就有naconda包括Conda、Python以及一大堆安装好的工具包&#xff0c;比如&#xff1a;numpy、pandas等 1&#xff09;包含conda&#x…...

【3维视觉】网格细分Mesh Subdivision算法介绍(Loop, Catmull-Clark, Doo-Sabin)

引言 介绍了Loop, Catmull-Clark, Doo-Sabin细分。 算法介绍 1. Loop细分 Loop细分是Charles Loop在1987年在硕士论文中提出的一种对三角网格的细分算法。 Loop细分是递归定义的&#xff0c;每一个三角形一分为四&#xff0c;对于新生成的点和旧点以不同的规则更新。 点的…...

自学大数据第六天~HDFS命令

HDFS常用命令 查看hadoop版本 version hadoop version注意,没有 ‘-’ [hadoopmaster ~]$ hadoop version Hadoop 3.3.4 Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb Compiled by stevel on 2022-07-29T12:3…...

maven仓库的配置

下载 官网下载&#xff1a;https://maven.apache.org/download.cgi 2. 配置maven环境 右键电脑 ->属性 -> 高级系统设置 -> 环境变量 -> 系统变量-新建 变量名&#xff1a;MAVEN_HOME 变量值为maven的文件安装地址 编辑Path系统变量 新建&#xff1a;%MAVE…...

医院信息管理云平台源码 云HIS系统源码 4级电子病历系统

基层医院云HIS系统源码 高端商业his源码 有演示&#xff0c;可直接项目运营。 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规…...

JS学习第9天——ES6中面向对象(类class、constructor构造函数、类的继承extends、super关键字、面向对象tab栏切换案例)

目录一、面向对象1、面向过程2、面向对象3、两者对比二、ES6中的类和对象1、面向对象的思维特点2、对象3、类class4、类constructor构造函数三、类的继承1、继承2、super()关键字3、注意点四、面向对象案例一、面向对象 两大编程思想&#xff1a;① 面向过程 ② 面向对象 1、…...

K8S核心秘术学习总纲

学习 Kubernetes (简称 K8S) 可以采取以下步骤&#xff1a; 了解 K8S 的基本知识&#xff1a;K8S 是一个负责管理容器的开源平台。 在学习 K8S 之前&#xff0c;需要先掌握 Linux 基础知识和 Docker 容器基础知识。 搭建 K8S 环境&#xff1a;为了学习 K8S&#xff0c;你需要有…...

【PTA-训练day27】L2-038 病毒溯源 + L2-039 清点代码库 + L2-040 哲哲打游戏

目录 L2-038 病毒溯源 - dfs求树最大深度及路径 L2-039 清点代码库 - STL嵌套使用结构体自定义排序 L2-040 哲哲打游戏 - vector建图 L2-038 病毒溯源 - dfs求树最大深度及路径 PTA | 程序设计类实验辅助教学平台 思路&#xff1a; 用链表建树 找到根节点dfs根节点寻找最大…...

建筑网站、/网络营销方案范文

import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt# autograd # fn1:torch.autograd.backward()自动求取梯度 # 参数&#xff1a;tensors:用于求导的tensor&#xff1b;retain_graph:保存计算图&#xff1b;create_graph:创建导数计算图…...

qq整人网站怎么做/自媒体营销

前几天受刺激了&#xff0c;准备把CSDN的校验码图片修改。就上网找了一些参考示例。和分析了一些校验码的功能。不敢独享&#xff0c;整理到一起&#xff0c;跟大家分享。 至于CSDN新的校验码写法&#xff0c;不是这里面的任何一种。也不是网上可以找到的。这个不好公开&#x…...

西安商城网站开发制作/百度招聘官网首页

我就废话不多说了&#xff0c;大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ii integer;declare num integer; begin II:2021-01-16 17:49:22条件查询-模糊匹配PostgreSQL和SQL Server的模糊匹配like是不一样的&am…...

渌口区市政建设局网站/seo优化网页

一&#xff0c;什么是依赖注入&#xff08;DI&#xff09; 个人理解依赖注入&#xff08;DI&#xff09;就是控制反转&#xff08;IOC&#xff09;思想的一种实现方式&#xff0c;降低了代码之间的耦合&#xff0c;在应用程序运行中动态的向某个对象提供它所需要的对象。 二&am…...

集团培训网站建设/网络营销软文范例300字

目录结构LuaSocket 是 Lua 的网络模块库&#xff0c;它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 它由两部分组成&#xff1a;一部分是用 C 写的核心&#xff0c;提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的&#…...

网架公司的名称/武汉seo网站推广

经常可以看到这个报错 &#xff0c;但是不直接显示明细。 可以在终端中运行下列指令&#xff1a; gradlew processDebugManifest --stacktraceandroid\app\src\main\AndroidManifest.xml:38:5-75 Warning:Element uses-permission#android.permission.READ_PHONE_STATE at An…...