美文网首页
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