使用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的基础上添加的prev系列方法,可以实现反向操作,最重要的是添加了add和set方法,可以实现遍历List的时候同时进行添加,修改的操作。

public interface ListIterator<E> extends Iterator<E>
系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。

List边遍历,边修改示例

public static void sop(Object obj){
    System.out.println(obj);
}

public static void main(String[] args){
    ArrayList a1 = new ArrayList();
    a1.add("java01");
    a1.add("java02");
    a1.add("java03");
    sop(a1);
    
    ListIterator li = a1.listIterator();
    while(li.hasNext()){
        Object obj = li.next();
        if(obj.equals("java01")){
            li.set("java009");
        }
    }
    sop(a1);
}

运行结果为:

[java01, java02, java03]
[java009, java02, java03]

Iterator 迭代器

方法示例

ArrayList<Character> list = new ArrayList<>();
for (char c = 'A'; c <= 'G'; c++) {
    list.add(c);
}

Iterator<Character> it = list.iterator();
while (it.hasNext()) {
    char c = it.next(); // next() 返回下一个元素
    if (c == 'C') {
        it.remove(); // remove() 移除元素
    } else {
        System.out.print(c + ", ");
    }
}

运行结果 :A,B,D,E,F,G

Iterator 的方法

方法 功能
hasNext() 判断集合列表中是否还有可以迭代的元素
next() 返回下一个元素
remove() 移除最近返回的一个元素

ListIterator 迭代器

方法示例

ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
    list.add(i);
}

ListIterator<Integer> li = list.listIterator();
boolean flag = true;
// 如果是正序迭代 或者 有前一个可以迭代的元素
while (flag || li.hasPrevious()) {
    int index = 0;
    int ele = 0;
    if (flag) {
        index = li.nextIndex();  // nextIndex() 返回下一个元素的索引
        ele = li.next();         // next() 返回下一个元素
    } else {
        index = li.previousIndex(); // previousIndex 返回上一个元素的索引
        ele = li.previous();        // previous() 返回上一个元素
    }
    if (ele == 1) {
        // 如果迭代到的元素是 1 ,则将该元素替换成 0
        li.set(0); // set() 用指定元素替换最后返回的元素
    } else if (ele == 3) {
        li.remove(); // remove() 移除最后返回的元素
    }
    System.out.println("(" + index + ") = " + ele);
    
    // 判断是否还有下一个可以迭代的元素
    if (!li.hasNext()) {
        flag = false;
        li.add(10); // add() 添加一个元素
    }
}

运行结果

{0} = 1
{1} = 2
{2} = 3
{2} = 10
{1} = 2
{0} = 0

ListIterator 的方法

方法 功能
hasNext() 判断是否还有下一个元素可以迭代
next() 返回下一个元素
hasPrevious() 判断是否还有上一个元素可以迭代
previous() 返回上一个元素
add() 返回上一个元素
set(E e) 用指定的元素替换最近返回的元素
remove() 移除最近返回的元素

Iterator 和 ListIterator 主要区别

  • ListIterator有add()方法,可以向List中添加对象,而Iterator不能

  • ListIterator和Iterator都有hasNext()next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

  • ListIterator可以定位当前的索引位置,nextIndex()previousIndex()可以实现。Iterator没有此功能。

  • ListIterator 可以再迭代时对集合进行addsetremove操作,而Iterator迭代器只能在迭代时对集合进行 remove 操作

赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏