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

        通过之前的介绍我们知道通过迭代器来遍历单例集合的操作仍然需要借助于循环结构。而且我们知道在单例集合中调用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,一经查实,立即删除!

相关文章

RockChip Android12 Launcher3启动与布局分析

目录 一:概述 二:编译 三:启动 1、AndroidManifest.xml 2、Launcher 四:布局 1、LauncherAppState 2、InvariantDeviceProfile 3、initGrid 4、getPredefinedDeviceProfiles 5、invDistWeightedInterpolate 6、initGrid 7、initDeviceProfile 8、DeviceProfil…

[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…

接口自动化测试

接口自动化测试 为什么要做自动化测试&#xff1f;如何做自动化测试测试工具 本文只讲方法&#xff0c;不会太多关注具体实用细节。 为什么要做自动化测试&#xff1f; 当接口的功能很复杂、很灵活、频繁变更时&#xff0c;代码稍微有些变更&#xff0c;影响范围很难短时间内…

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

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

打造你的跨境电商平台:从pandabuy的成功看如何开发淘宝代购集运系统

在当今全球化的电商浪潮中&#xff0c;跨境购物已成为一种趋势。pandabuy作为一个成功的跨境独立站&#xff0c;其淘宝代购集运系统凭借高效的服务和优质的用户体验广受欢迎。对于希望建立类似平台的创业者来说&#xff0c;深入分析pandabuy的成功经验&#xff0c;并运用于自身…

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;我计算出来的是占…

前端请求XMLHttpRequest详解

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 javascript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 这篇文章…

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

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

业务场景问题二:部分业务场景问题(简)

在面试环节&#xff0c;通常面试官会问一些企业级开发项目中的场景问题&#xff0c;大致可分为以下几个部分&#xff0c;本章作为简易引导&#xff0c;不作详细的技术解答。 面试的业务场景问题 处理亿级数据库&#xff1a; 数据库分库分表&#xff1a;使用分片技术将数据按照…

Docker环境安装anythingllm

拉镜像 docker pull mintplexlabs/anythingllm建目录 export STORAGE_LOCATION$HOME/anythingllm && \ mkdir -p $STORAGE_LOCATION && \ touch "$STORAGE_LOCATION/.env"检查目录具有写权限 # 为目录anythingllm赋写权限 chmod 777 anythingllm 启…

探索Scala的尾递归优化:性能提升的秘诀

探索Scala的尾递归优化&#xff1a;性能提升的秘诀 引言 在函数式编程中&#xff0c;递归是一种常见的编程范式。然而&#xff0c;传统的递归可能会因为堆栈溢出而导致性能问题。Scala作为一门支持函数式编程的语言&#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;表示…

eslint版本9.0之后配置方法

在eslint9.0之后&#xff0c;迎来版本大更新。首先是抛弃了自带的规则&#xff08;没了我喜欢的git standard风格&#xff09;&#xff0c;其次是配置又更新了&#xff0c;改动有点大&#xff0c;重新捋了一遍之后&#xff0c;附上最新的eslint配置过程。 初始化命令 此次试验…

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

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