使用ListIterator 对List遍历时修改,删除
无论使用什么方式对List进行遍历,都不能直接对List<E>变量进行直接修改操作,比如:
List<String> strList = new ArrayList<String>();
strList.add("john");strList.add("mark");
strList.add("alen");strList.add("jason");
for(String strElem:strList)
{if(strElem.equals("john")){strList.add("Davien");}
}
上面的代码想在“john”后面添加“Davien”,但是很不幸,会抛出java.util.ConcurrentModificationException异常,就是因为对在循环中对strList变量进行直接修改。Iterator可以提供容器类的统一遍历方式,并且可以在遍历中使用remove方法删除元素,但是任然不能解决遍历时修改List的需求,ListIterator在Iterator的基础上添加的pre系列方法,可以实现反向操作,最重要的是添加了add和set方法,可以实现遍历List的时候同时进行添加,修改的操作。请看例子。
package cn.jnk.tools;import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;import org.junit.Test;/*** Unit test for simple App.*/
public class AppTest
{@Testpublic void ListTest(){boolean doExceptionTest = false;List<Phone> phones = new ArrayList<Phone>();phones.add(new Phone("111"));phones.add(new Phone("183"));phones.add(new Phone("182"));phones.add(new Phone("185"));System.out.println("原始数据");for(Phone phoneElem:phones){System.out.println(phoneElem.getNumber());}ListIterator<Phone> phoneIterator = phones.listIterator();while(phoneIterator.hasNext()){Phone tmpPhone = phoneIterator.next();if(tmpPhone.getNumber().equals("111")){tmpPhone.setNumber("666");phoneIterator.set(tmpPhone);phoneIterator.add(new Phone("132")); // use ListIterator add item is ok}if(tmpPhone.getNumber().equals("183")){phoneIterator.remove();}if(doExceptionTest){phones.add(new Phone("170")); // throw java.util.ConcurrentModificationException}}System.out.println("\n修改后正向遍历:");for(Phone phoneElem:phones){System.out.println(phoneElem.getNumber());}System.out.println("\n修改后反向遍历:");//反向遍历while(phoneIterator.hasPrevious()){System.out.println(phoneIterator.previousIndex() + ": "+phoneIterator.previous().getNumber());}}}class Phone
{private String number;public Phone(){}public Phone(String number){this.number = number; }public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}
}
输出结果如下:
使用ListIterator 对List遍历时修改,删除相关推荐
- java_基础_遍历map删除元素_Java 遍历Map(包括集合)时,修改删除元素
转载自:https://blog.csdn.net/weixin_33498283/article/details/114071025 1.遍历Map集合的四种方法 public staticvoid ...
- 21、List遍历时修改元素的问题
List迭代时修改元素的问题 请编写代码完成以下需求: 判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串.' package com.monkey1024.lis ...
- List集合遍历时如何删除元素
背景:在业务中遍历某个集合时涉及到排除某个属性为0的情况,即遍历时删除. 一.3种错误方式演示三种: 1.foreach List<String> list = new ArrayList ...
- java利用循环打印AVA_ava.util.ArrayList在foreach循环遍历时可以删除元素
ArrayList是java开发时非常常用的类,常碰到需要对ArrayList循环删除元素的情况.这时候大家都不会使用foreach循环的方式来遍历List,因为它会抛java.util.Concur ...
- 列表和字典循环遍历时的删除问题,集合
1.for 循环的问题 : for 循环后面也有else,也可以使用break和continue(使用方法跟while一样). while 条件: for ...
- java动态删除map元素报错_java map使用迭代器遍历时执行删除元素报空指针异常
我建立了两个Map,其流程是遍历两个map,将map1中value值与map2中相同,但是K值不同的数据查找出来.然后把这条数据从Map2中删除.我使用迭代器在执行移除的时候是报空指针(java.la ...
- 【Java】遍历时优雅地删除集合元素
实体类 import java.io.Serializable; import java.util.Objects;public class Person implements Serializabl ...
- C++中反向遍历map时怎样删除元素
文章目录 前言 map的正向遍历 map 遍历时删除元素 map 的反向遍历 map 反向遍历时删除元素 总结 前言 今天在解决一个问题 <5710. 积压订单中的订单总数> 时用到了ma ...
- List如何在遍历时删除元素
背景:业务中经常会涉及遍历list时对集合进行插入或者删除操作 一. 错误方式 先看看下面几段代码,1是foreach的方式去遍历list并删除元素,2是用迭代器的方式遍历list并删除元素,3是下标 ...
最新文章
- HttpClient 连接池设置引发的一次雪崩!
- 报名 | 第三期医工结合系列研讨会:科研领域的知识产权保护
- jieba分词中cut和lcut的区别
- zabbix的安装配置
- MVC Html.AntiForgeryToken() 防止CSRF***
- SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程
- linux根目录数量限制,windows,linux文件夹下文件上限最大个数
- 极客大学架构师训练营 大数据架构 MapReduce Yarn Hive SQL 第24课 听课总结
- the true story about using data mining to identify a relation between sales of beer and diapers
- 非线性控制2.0——鲁棒控制之H无穷控制器设计
- sip信令超时时间调整
- 计算机音乐恋曲1990字谱,歌曲恋曲1990简谱
- 【LEETCODE】【鱼缸难题】
- 元学习(Meta Learning)最全论文、视频、书籍资源整理
- vue-element换肤所有主题色和基础色均可自主配置
- 道里云公司网络虚拟化架构NVI技术开放源代码--序言
- python爬取高匿代理IP(再也不用担心会进小黑屋了)
- mp3计算机无法识别,MP3\MP4连接windows电脑后无法识别怎么办
- 企业项目实战k8s篇(十)Volumes配置管理
- 【PyTorch】随机种子 与 网络初始化