通过迭代器删除容器中的元素

        通过之前的介绍我们知道通过迭代器来遍历单例集合的操作仍然需要借助于循环结构。而且我们知道在单例集合中调用iterator方法返回的Iterator对象中还有一个remove方法我们没有介绍,它的作用是删除容器中的元素。说道这里应该有人会发现一个很明显的问题,那就是在单例集合中我们不是就已经定义过一个remove方法了吗,为什么还要在迭代器中定义一个remove方法呢?这不是多此一举吗?

        为了解决这个问题,我们首先要解决一个问题——在单例集合中能否在循环结构中对元素进行增删操作。答案自然是不行的,那为为什么?接下来我们进入分析。

        首先创建一个单例集合容器list,这个容器用ArrayList容器类来进行实现,因此它的元素具有索引,我们可以通过索引对它的元素进行操作。显然,在我们通过for循环来遍历元素之前对容器llist中的元素进行增删操作是没有问题的,但是现在我们想在进行遍历的同时对容器中的元素进行增删操作。

        一、删除元素。

        如果我们在遍历元素的时候删除了元素中指定位置的元素会出现什么现象呢。我们用一个实例来进行说明。在下面的这个代码中,我们将a、b、c、d四个元素添加到了容器list中,在遍历其中的元素时我们打算删除索引为2的元素,也就时删除元素c,这个是我们期望得到的结果。但是从执行结果来看,我们同时删除了元素c和d,这是为什么呢?因为当我们第一次删除了索引为2的元素时,容器的大小就发生改变了,也就是list.size的值从4变成了3,这时在变化了的容器容器中,元素d向前移动了一个位置,它的索引变成了2,所以再执行循环结构,自然会将他删除。也就是说这个代码无法完成我们只删除元素c的需求。当然,要完成我们的需求可以对这个代码做出简单的修改,在执行删除的部分添加判断条件,将代码改为

        if(c.eauals(list.get(i)){

                list.remove(i);

          }

这样显然时能够达到我们的要求的,可是如果要删除多个元素,显然不会是一种有效的方法,因此这种写法也不可取。

package com.container.demo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteratorRemoveTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.add("d");for (int i = 0; i < list.size(); i++) {list.remove(2);//改变数据结果//list.add("dd");死循环System.out.println(list.get(i));}}
}

        二、增加元素

        既然删除元素不可以,那么相对的在通过循环来遍历容器中的元素的同时往容器中增加元素显然而也是不可以的 。不过我们自然不信邪,抱着尝试弄死系统的态度我们浅浅尝试以下如果非要在遍历元素的时候向容器中添加元素又会发生什么样的情况呢?我们仍然以list容器为例子,在遍历元素时我们在for循环中添加元素dd,代码展示如下。

        根据运行结果我们发现代码陷入了死循环,这是为什么呢?在我们看来这个代码应该不具备死循环的条件才对。那么真的不具备吗?其实当我们在for循环中添加元素的时候,容器的大小就已经发生改变了,也就是说每执行一次循环list.size()的值都会加一,那么用来进行判断是否进行循环的变量i的值增加一,list.size()的值也会增加一,所以i的值永远比list.size()的值小。循环条件一直满足,所以循环一直执行。

package com.container.demo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteratorRemoveTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.add("d");for (int i = 0; i < list.size(); i++) {//list.add("dd");死循环System.out.println(list.get(i));}}
}

 

         通过上面的介绍我们知道,通过普通的循环结构去遍历容器中的元素时是不能对容器中的元素进行删除操作的。那么如果我们想要在遍历元素的同时对元素进行删除操作可不可以呢?答案是可以。这里只需要我们采用迭代器来遍历元素中的元素就可以在遍历元素的同时对元素进行删除操作。能这样做的原因是用迭代器遍历元素的的时候设计元素索引的应用,而且判断循环是否执行的条件也与元素的索引无关。

        但是这里有两个注意的点,第一是在通过迭代器来遍历容器中的元素的时候不能重复调用next方法,因为next方法不仅会返回当前位置的元素,还会将指针移动到下一个元素的位置。如果多次调用next方法,极有可能会导致容器中的元素丢失,无法正常遍历容器中的元素。另一个需要注意的点是,通过迭代器迭代元素时是不能向容器中添加元素的,虽然这么写在编译时不会报错,但是运行时是不被允许的。

        此外,我们之前就说过增强for循环即for-each循环其实也算是迭代器,所以用它来遍历容器中的元素时也可以调用remove方法来对容器中的元素进行删除操作,但仍然不可以添加元素。

package com.container.demo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteratorRemoveTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.add("d");for (int i = 0; i < list.size(); i++) {//list.remove(2);改变数据结果//list.add("dd");死循环System.out.println(list.get(i));}System.out.println("_____________________________");Iterator<String> iterator = list.iterator();while(iterator.hasNext()){//不能在一个迭代器种多次调用next()。String value = iterator.next();if("c".equals(value)){iterator.remove();}}for(Iterator<String> it = list.iterator();it.hasNext(); ){String va = it.next();System.out.println(va);//list.add("ddd");//编译不报错,但运行会报错,在迭代器包括增强for循环中不能添加元素}}
}

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

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

相关文章

[MySql]两阶段提交

文章目录 什么是binlog使用binlog进行恢复的流程 什么是redolog缓冲池redologredolog结构 两阶段提交 什么是binlog binlog是二进制格式的文件&#xff0c;用于记录用户对数据库的修改&#xff0c;可以作用于主从复制过程中数据同步以及基于时间点的恢复&#xff08;PITR&…

Webpack: 借助 Babel+TS+ESLint 构建现代 JS 工程环境

概述 Webpack 场景下处理 JavaScript 的三种常用工具&#xff1a;Babel、TypeScript、ESLint 的历史背景、功能以及接入 Webpack 的步骤借助这些工具&#xff0c;我们能构建出更健壮、优雅的 JavaScript 应用 使用 Babel ECMAScript 6.0(简称 ES6) 版本补充了大量提升 JavaSc…

互联网应用主流框架整合之Spring Boot运维体系

先准备个简单的系统&#xff0c;配置和代码如下 # 服务器配置 server:# 服务器端口port: 8001# Spring Boot 配置 spring:# MVC 配置mvc:# Servlet 配置servlet:# Servlet 的访问路径path: /sbd# 应用程序配置application:# 应用程序名称name: SpringBootDeployment# 配置数据…

第 133 场 LeetCode 双周赛题解

A 使所有元素都可以被 3 整除的最少操作数 遍历 n u m s nums nums &#xff0c;每有一个不被 3 3 3 整除的数&#xff0c;则操作数加 1 1 1 class Solution {public:int minimumOperations(vector<int>& nums) {int res 0;for (auto x : nums)if (x % 3 ! 0)res…

杂记 | 搭建反向代理防止OpenAI API被封禁(对于此次收到邮件提示7月9日后将被屏蔽的解决参考)

文章目录 重要声明&#xff08;免责&#xff09;01 OpenAI封禁API的情况02 解决方案及原理2.1 原因分析2.2 解决方案2.3 步骤概述 03 操作步骤3.1 购买一个海外服务器3.2 申请一个域名3.3 将域名指向代理服务器3.4 在代理服务器上安装nginx3.5 配置反向代理 重要声明&#xff0…

网工内推 | 深圳网工,国企,最高20k,六险一金,NA以上认证

01 沛顿科技&#xff08;深圳&#xff09;有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1、负责网络设备管理及维护&#xff0c;确保网络系统的稳定运行&#xff1b; 2、负责有效规划及实施网络布线系统&#xff1b; 3、负责服务…

LV、古驰奢侈品跌落神坛!2024消费风向彻底变天!2024创业新风口!2024创业小成本项目!

LV下滑6%、古驰暴跌28%&#xff0c;奢侈品在华越来越卖不动&#xff0c;外媒开始着急了&#xff01;就在前段时间&#xff0c;美媒罕见发声&#xff0c;表示今年1季度特别困难&#xff0c;有奢侈品公司在华负增长高达30%。还说如何提升销量&#xff0c;是当下奢侈品牌在华的头等…

使用matlab开发stm32总结,stm32-matlab常见的问题处理以及报错合集

1&#xff0c; 问题&#xff1a;本来是好的&#xff0c;突然编译运行报错&#xff0c;说是确少包&#xff0c; 解决方案&#xff1a;重启以后好了 2&#xff0c;有完美的马鞍波&#xff0c;为什么不能够转动呢&#xff1f; 原因是我这里模型的问题&#xff0c;我计算出来的是占…

全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动顺利开展

6月21日&#xff0c;省教育评估院在四川邮电职业技术学院组织开展全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动。省教育评估院副院长赖长春&#xff0c;四川邮电职业技术学院党委副书记、校长冯远洪&#xff0c;四川邮电职业技术学院党委委员、副校长程德杰等出席…

PCL笔记二 之VS环境配置(不同版本Debug+Release编译)

PCL笔记二 之VS环境配置(不同版本Debug+Release编译) PCL官网:https://github.com/PointCloudLibrary/pcl/releases众所周知,PCL是一个用于点云处理并且依赖不少三方库的一个算法库,同时在编译配置环境时也很复杂,因此这里想整理一下不同版本对应的环境配置过程,版本如下…

力扣921. 使括号有效的最少添加

Problem: 921. 使括号有效的最少添加 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义int变量res、need分别记录需要插入的左括号数和所需与左括号配对的右括号数&#xff1b; 2.遍历字符串&#xff1a; 2.1.若当为左括号&#xff0c;则need&#xff0c;表示…

[word] 如何在word中插入地图? #学习方法#其他

如何在word中插入地图&#xff1f; 人事部门在给即将入职的新员工发送入职资料时&#xff0c;为了方便新员工能快速找到公司的具体位置&#xff0c;一般都会在word资料中插入公司所在位置的地图。今天&#xff0c;小编就分享一个在word中插入地图的方法。 第一步&#xff1a;…

企智汇软件:专业项目管理系统,一体化PaaS平台!快速落地项目!

在快速变化的市场环境中&#xff0c;项目管理不再是简单的任务分配和时间跟踪&#xff0c;它更是一门需要精准决策、高效沟通和智能协作的管理工具。然而&#xff0c;面对日益复杂的项目需求、跨部门的协作挑战以及海量的信息数据&#xff0c;传统的项目管理方式往往显得力不从…

数值分析笔记(三)函数逼近

最佳平方逼近 函数逼近是使用一种简单易算的函数来近似表示一个复杂函数。 该问题可转化为求解线性方程组 G n C F n ​ G_{n}CF_{n}​ Gn​CFn​​ 其中&#xff0c;系数 C ( c 0 , c 1 , ⋯ , c n ) T , F n ( ( f , φ 0 ) , ( f , φ 1 ) , ⋯ , ( f , φ n ) ) T C(c…

【Java】解决Java报错:IllegalMonitorStateException in Synchronization

文章目录 引言一、IllegalMonitorStateException的定义与概述1. 什么是IllegalMonitorStateException&#xff1f;2. IllegalMonitorStateException的常见触发场景3. 示例代码 二、解决方案1. 确保在同步代码块或方法中调用wait()、notify()和notifyAll()2. 使用同步方法3. 使用…

Linux系统学习——指令三

Linux系统学习——指令三 Linux系统学习——指令三chmod — 文件执行权限添加文件执行权限去除文件执行权限 查找文件中特定关键字使用vi编辑文件并查找特定关键字文本文件查找特定关键字1: 使用 grep 命令2: 使用 find 命令3: 使用 awk 命令4: 使用 sed 命令5: 使用 ag 命令&a…

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中&#xff0c;我们介绍了大语言模型与人类对齐的“3H原则”&#xff0c;以及基于人类反馈的强化学习方法&#xff08;RLHF&#xff09;&#xff0c;本文将继续介绍另外一种非强化学习的对齐方法&#xff1a;直接偏好优化&am…

Vulnhub靶场DC-4练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 爆破登录2. 命令执行3. 反弹shell4. hydra爆破ssh5. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-4.zip 介绍&#xff1a; DC-4 is another purposely built …

交通信号灯控制系统的设计(仿真,汇编语言实现)——微机课设

计算机科学与技术 专业课程设计任务书 学生姓名 专业班级 学号 题 目 交通信号灯控制系统的设计 课题性质 A.工程设计 课题来源 自拟课题 指导教师 同组姓名 主要内容 初始状态用K1键控制&#xff0c;为两个黄灯闪烁&#xff1b; K2键控制红、黄、绿灯接…

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型

Diffusion Mamba&#xff1a;用于CT到MRI转换的Mamba扩散模型 提出背景拆解左侧&#xff1a;整体框架中间&#xff1a;Mamba块的细节右侧&#xff1a;螺旋扫描的细节 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.15910 代码&#xff1a;https://github.com/wongzbb…