开发技术-Java集合(List)删除元素的几种方式
文章目录
- 1. 错误的删除
- 2. 正确的方法
- 2.1 倒叙删除
- 2.2 迭代器删除
- 2.3 removeAll() 删除
- 2.4 removeIf() 最简单的删除
- 3. 总结
1. 错误的删除
在写代码时,想将其中的一个元素删除,就遍历了 list ,使用了 remove(),发现效果并不是想要的。
List<String> list = new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");list.add("abc");list.add("abd");System.out.println("原list:" + JSON.toJSONString(list));List<String> list2 = new ArrayList<>();list2.addAll(list);List<String> list3 = new ArrayList<>();list3.addAll(list);List<String> list4 = new ArrayList<>();list4.addAll(list);List<String> list5 = new ArrayList<>();list5.addAll(list);// 有问题的删除for (int i = 0; i < list.size(); i++) {if (list.get(i).startsWith("a")) {list.remove(i);}}System.out.println("过滤后list:" + JSON.toJSONString(list));
输出:
原list:["aa","bb","cc","abc","abd"]
过滤后list:["bb","cc","abd"]
元素 abd 并没有过滤出去,这是因为,使用 remove() 后,导致 list 的长度发生了改变,后续遍历时,abd 的下标取不到了。
2. 正确的方法
2.1 倒叙删除
既然顺序遍历会有问题,那么倒叙遍历会怎么样呢
// 倒叙删除for (int i = list2.size() - 1; i >= 0; i--) {if (list2.get(i).startsWith("a")) {list2.remove(i);}}
输出:
原list2:["aa","bb","cc","abc","abd"]
过滤后list2:["bb","cc"]
达到预期。
2.2 迭代器删除
当然了,常用的还有迭代器删除
// 迭代器删除Iterator<String> iterator3 = list3.iterator();while (iterator3.hasNext()) {if (iterator3.next().startsWith("a")) {iterator3.remove();}}
2.3 removeAll() 删除
创建一个删除集合,然后 removeAll
// 组装删除集合后删除List<String> delList = new ArrayList<>();for (int i = 0; i < list4.size(); i++) {if (list4.get(i).startsWith("a")) {delList.add(list4.get(i));}}list4.removeAll(delList);
2.4 removeIf() 最简单的删除
// 最简单的删除,JDK8及以上list5.removeIf(l -> l.startsWith("a"));
3. 总结
对 List 集合进行删除时,可使用迭代器,最简单的是使用 List 集合的 removeIf()
全部代码如下:
/*** @Author: caimeng01* @CreateTime: 2024/2/28 17:50* @Description: TODO(一句话描述该类的功能)*/
package list;import com.alibaba.fastjson.JSON;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class T2 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");list.add("abc");list.add("abd");System.out.println("原list:" + JSON.toJSONString(list));List<String> list2 = new ArrayList<>();list2.addAll(list);List<String> list3 = new ArrayList<>();list3.addAll(list);List<String> list4 = new ArrayList<>();list4.addAll(list);List<String> list5 = new ArrayList<>();list5.addAll(list);// 有问题的删除for (int i = 0; i < list.size(); i++) {if (list.get(i).startsWith("a")) {list.remove(i);}}System.out.println("过滤后list:" + JSON.toJSONString(list));System.out.println("-------------------------");System.out.println("原list2:" + JSON.toJSONString(list2));// 倒叙删除for (int i = list2.size() - 1; i >= 0; i--) {if (list2.get(i).startsWith("a")) {list2.remove(i);}}System.out.println("过滤后list2:" + JSON.toJSONString(list2));System.out.println("-------------------------");System.out.println("原list3:" + JSON.toJSONString(list3));// 迭代器删除Iterator<String> iterator3 = list3.iterator();while (iterator3.hasNext()) {if (iterator3.next().startsWith("a")) {iterator3.remove();}}System.out.println("过滤后list3:" + JSON.toJSONString(list3));System.out.println("-------------------------");System.out.println("原list4:" + JSON.toJSONString(list4));// 组装删除集合后删除List<String> delList = new ArrayList<>();for (int i = 0; i < list4.size(); i++) {if (list4.get(i).startsWith("a")) {delList.add(list4.get(i));}}list4.removeAll(delList);System.out.println("过滤后list4:" + JSON.toJSONString(list4));System.out.println("-------------------------");System.out.println("原list5:" + JSON.toJSONString(list5));// 最简单的删除,JDK8及以上list5.removeIf(l -> l.startsWith("a"));System.out.println("过滤后list5:" + JSON.toJSONString(list5));}
}
输出:
原list:["aa","bb","cc","abc","abd"]
过滤后list:["bb","cc","abd"]
-------------------------
原list2:["aa","bb","cc","abc","abd"]
过滤后list2:["bb","cc"]
-------------------------
原list3:["aa","bb","cc","abc","abd"]
过滤后list3:["bb","cc"]
-------------------------
原list4:["aa","bb","cc","abc","abd"]
过滤后list4:["bb","cc"]
-------------------------
原list5:["aa","bb","cc","abc","abd"]
过滤后list5:["bb","cc"]
(图网,侵删)
相关文章:

开发技术-Java集合(List)删除元素的几种方式
文章目录 1. 错误的删除2. 正确的方法2.1 倒叙删除2.2 迭代器删除2.3 removeAll() 删除2.4 removeIf() 最简单的删除 3. 总结 1. 错误的删除 在写代码时,想将其中的一个元素删除,就遍历了 list ,使用了 remove(),发现效果并不是想…...
c++ 递归
递归函数是指在函数定义中调用自身的函数。C语言也支持递归函数。 下面是一个使用递归函数计算阶乘的例子: #include <iostream> using namespace std;int factorial(int n) {// 基本情况,当 n 等于 0 或 1 时,阶乘为 1if (n 0 || n…...

RedHat9 | podman容器
1、容器技术介绍 传统问题 应用程序和依赖需要一起安装在物理主机或虚拟机上的操作系统应用程序版本比当前操作系统安装的版本更低或更新两个应用程序可能需要某一软件的不同版本,彼此版本之间不兼容 解决方式 将应用程序打包并部署为容器容器是与系统的其他部分…...
边缘计算项目有哪些
边缘计算项目在多个领域得到了广泛的应用,以下是一些典型的边缘计算项目案例: 1. **智能交通系统**:通过在交通信号灯、监控摄像头等设备上部署边缘计算,可以实时分析交通流量,优化交通信号控制,减少拥堵&…...
计算fibonacci数列每一项时所需的递归调用次数
斐波那契数列是一个经典的数列,其中每一项是前两项的和,定义为: [ F(n) F(n-1) F(n-2) ] 其中,( F(0) 0 ) 和 ( F(1) 1 )。 对于计算斐波那契数列的第 ( n ) 项,如果使用简单的递归方法,其时间复杂度是…...

【教学类65-05】20240627秘密花园涂色书(中四班练习)
【教学类65-03】20240622秘密花园涂色书03(通义万相)(A4横版1张,一大 68张纸136份)-CSDN博客 背景需求: 打印以下几款秘密花园样式(每款10份)给中四班孩子玩一下,看看效果 【教学类…...
Python 学习之基础语法(一)
Python的语法基础主要包括以下几个方面,下面将逐一进行分点表示和归纳: 一、基本语法 1. 注释 a. 单行注释:使用#开头,例如# 这是一个单行注释。 b. 多行注释:使用三引号(可以是三个单引号或三个双引号&…...

日志分析-windows系统日志分析
日志分析-windows系统日志分析 使用事件查看器分析Windows系统日志 cmd命令 eventvwr 筛选 清除日志、注销并重新登陆,查看日志情况 Windows7和Windowserver2008R2的主机日志保存在C:\Windows\System32\winevt\Logs文件夹下,Security.evtx即为W…...

【ARM】MDK工程切换高版本的编译器后出现error A1137E报错
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决工程从Compiler 5切换到Compiler 6进行编译时出现一些非语法问题上的报错。 2、 问题场景 对于一些使用Compiler 5进行编译的工程,要切换到Compiler 6进行编译的时候,原本无任何报错警告…...

深入 SSH:解锁本地转发、远程转发和动态转发的潜力
文章目录 前言一、解锁内部服务:SSH 本地转发1.1 什么是 SSH 本地转发1.2 本地转发应用场景 二、打开外部访问大门:SSH 远程转发2.1 什么是 SSH 远程转发2.2 远程转发应用场景 三、动态转发:SSH 让你拥有自己的 VPN3.1 什么是 SSH 动态转发3.…...
python如何把一个函数的返回值,当成这个函数的参数值
python如何把一个函数的返回值,当成这个函数的参数值 1. 递归调用 递归是一种函数自己调用自己的方法。在递归调用中,你可以将前一次调用的返回值作为下一次调用的参数。 def recursive_function(x):# 函数逻辑if 条件满足:return 结果else:return rec…...

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例应用
随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…...

SpringBoot: Eureka入门
1. IP列表 公司发展到一定的规模之后,应用拆分是无可避免的。假设我们有2个服务(服务A、服务B),如果服务A要调用服务B,我们能怎么做呢?最简单的方法是让服务A配置服务B的所有节点的IP,在服务A内部做负载均衡调用服务B…...

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
简介 TypeScript 是 JavaScript 的超集,是 JavaScript(弱类型语言) 的强类型版本。 拥有类型机制文件后缀 .tsTypescript type ES6TypeScript 和 JavaScript 的关系类似 less 和 css 的关系TypeScript对 JavaScript 添加了一些扩展&#x…...

智慧校园-实训管理系统总体概述
智慧校园实训管理系统,专为满足高等教育与职业教育的特定需求而设计,它代表了实训课程管理领域的一次数字化飞跃。此系统旨在通过革新实训的组织结构、执行流程及评估标准,来增强学生的实践操作技能和教师的授课效率,为社会输送具…...

如何用GPT开发一个基于 GPT 的应用?
原文发自博客:GPT应用开发小记 如何开发一个基于 GPT 的应用?答案就在问题里,那就是用 GPT 来开发基于 GPT 的应用。本文以笔者的一个开源项目 myGPTReader 为例,分享我是如何基于 GPT 去开发这个系统的,这个系统的功能…...
大数据生态体系中各组件的区别面试题(更新)
一、MapReduce与Spark有什么区别? 1、处理方式: MapReduce基于磁盘处理数据,将中间结果保存到磁盘中,减少了内存占用,计算速度慢。 基于内存处理数据,将计算的中间结果保存到内存中,计算速度快。2、资源申请方式&…...

数字信号处理实验一(离散信号及离散系统的MATLAB编程实现)
实验要求: 离散信号及离散系统的MATLAB编程实现(2学时) 要求: 编写一程序,输出一定长度(点数),具有一定幅度、(角)频率和初始相位的实(或复&…...
数字图像处理专栏——introduction
Introduction: 数字图像处理技术是我在深入学习研究的方向之一。本科期间跟随导师做基于AndroidOpenCV的病虫识别app,因此入门,我也对该部分知识有进一步探索的欲望,但更多的是因该脚踏实地一步步记录,一步步成长。 本篇从数字图…...

Django 模版继承
1,设计母版页 Test/templates/6/base.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 修正了模板标签的全角字符问题 -->{% block title %}<title>这个是母版页</title>{…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...