使用ListIterator 对List遍历时修改,删除
来源:互联网 发布:达内 训机构北京php 编辑:程序博客网 时间:2024/06/04 01:05
无论使用什么方式对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;}}
输出结果如下:
1 0
- 使用ListIterator 对List遍历时修改,删除
- list遍历时删除元素
- 黄聪:C#使用能够foreach对hashtable、List遍历时“集合已修改;可能无法执行枚举操作。”错误
- List,Set,Map遍历时删除元素
- List遍历时陷阱
- 如何在遍历时删除List中的元素
- c++下list在遍历时删除节点的方法
- python list遍历时删除元素的推荐做法
- java遍历时删除元素
- map遍历时,删除元素
- List集合遍历时修改元素出现并发修改异常总结
- 集合list在遍历时是不能做删除操作的
- c++中List在遍历时删除节点的方法,带源码
- c++中List在遍历时删除节点的方法(转载)
- vector, list, map在遍历时删除符合条件的元素
- std中vector和list容器遍历时元素的动态删除
- Java遍历时删除List、Set、Map中的元素(源码分析)
- js 截取字符串 list遍历时
- codeforces 725G. Messages on a Tree
- 【UML】构件图(Component Diagram)
- c++ 进制转换,字母大小写转换,map按值排序 简单函数
- 数据结构实验之数组一:矩阵转置
- The NTLM Authentication Protocol
- 使用ListIterator 对List遍历时修改,删除
- #扫疑贴#大地坐标系、投影坐标系和投影变换的关系
- 【练习】计算1!+2!+...+n!之和
- Python运算符重载
- git使用教程
- 使用Arduino开发板控制伺服电机
- SSM(Spring+SpringMVC+MyBatis)框架学习心路历程【一】
- SRPG Studio学习笔记
- Java之语法基础