美文网首页
List循环删除后遍历

List循环删除后遍历

作者: apart_times | 来源:发表于2018-09-04 18:44 被阅读0次

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等方法,解决了实际开发中遍历删除后,继续遍历的问题

相关文章

网友评论

      本文标题:List循环删除后遍历

      本文链接:https://www.haomeiwen.com/subject/dxdnwftx.html