List循环删除后遍历

for循环删除的错误

import java.util.*;
public class Test {
    public static void main(String[] args) {

        List<String> testString = new ArrayList<>();
        testString.add("testa");
        testString.add("testb");
        testString.add("test");
        testString.add("testc");
        testString.add("testd");

        for(String s : testString){
            if(s.equals("test")){
                testString.remove(s);
            }
        }
    }
}

由于删除过程中,列表结构发生改变,所以后面的遍历会报错,报错信息如下:


image.png

Iterator删除

import java.util.*;

public class Test {

    public static void main(String[] args) {

        List<String> testString = new ArrayList<>();
        testString.add("testa");
        testString.add("testb");
        testString.add("test");
        testString.add("testc");
        testString.add("testd");

        Iterator<String> iterator = testString.iterator();
        while (iterator.hasNext()){
            String s = iterator.next();
            if("test".equals(s)){
                iterator.remove();
            }      
        }
    }
}

此时iterator数据能够正确删除,但是由于Iterator的游标已经偏移到iterator的尾部,Iterator对象没有方法重置游标的方法,所以后续无法遍历

ListIterator删除后遍历

import java.util.*;

public class Test {

    public static void main(String[] args) {
        List<String> testString = new ArrayList<>();
        testString.add("testa");
        testString.add("testb");
        testString.add("test");
        testString.add("testc");
        testString.add("testd");

        ListIterator<String> listIterator = testString.listIterator();
        while (listIterator.hasNext()){
            String s = listIterator.next();
            if("test".equals(s)){
                listIterator.remove();
            }
        }

        // 游标重置为末尾, 倒序遍历即可
        while(listIterator.hasPrevious()){
            String s = listIterator.previous();
            // 此时数据是倒序的, do something
            System.out.println(s);
        }
    }
}

使用ListIterator.previous即可循环倒序遍历,如果处理逻辑对于顺序无要求,可以直接在while循环里面操作,否则可以新建一个list,倒序赋值即可得到正序列表,然后再进行逻辑处理

ListIterator继承Iterator对象,同时增加了hasPrevious, previous等方法,解决了实际开发中遍历删除后,继续遍历的问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,415评论 0 4
  • 集合类框架的介绍: ![Java 集合类框架](https://upload-images.jianshu.io/...
    LynnGuo阅读 764评论 0 1
  • 10月13日,学校组织学生去云门山风景区秋游。 孩子们看了半个小时的动物表演。 第一个上场的是鹦鹉。鹦鹉套圈、鹦鹉...
    游游老师阅读 392评论 1 3
  • 为什么要读书呢? 第3,会引发更多的思考,比如美学,设计等......; 那第三点,我想说的就是其实在读书的这些过...
    拾光小世界阅读 286评论 0 1
  • 本文参加#“再见,不负遇见——我的大学”#活动,本人承诺,文章内容为原创,且未在其他平台发表过。 高考完后的暑假,...
    九亿少女的梦6996阅读 261评论 0 1