zoukankan      html  css  js  c++  java
  • 如何正确遍历删除List中的元素

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式:

    1.通过增强的for循环删除符合条件的多个元素

    2.通过增强的for循环删除符合条件的一个元素

    3.通过普通的for删除删除符合条件的多个元素

    4.通过Iterator进行遍历删除符合条件的多个元素

        /**
         * 使用增强的for循环
         * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
         */
        public void listRemove() {
            List<Student> students = this.getStudents();
            for (Student stu : students) {
                if (stu.getId() == 2) 
                    students.remove(stu);
            }
        }
        /**
         * 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
         */
        public void listRemoveBreak() {
            List<Student> students = this.getStudents();
            for (Student stu : students) {
                if (stu.getId() == 2) {
                    students.remove(stu);
                    break;
                }
            }
        }
        /**
         * 这种遍历有可能会遗漏某个元素,因为删除元素后List的size在
         * 变化,元素的索引也在变化,比如你循环到第2个元素的时候你把它删了,
         * 接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。当访问的元素
         * 索引超过了当前的List的size后还会出现数组越界的异常,当然这里不会出现这种异常,
         * 因为这里每遍历一次都重新拿了一次当前List的size。
         */
        public void listRemove2() {
            List<Student> students = this.getStudents();
            for (int i=0; i<students.size(); i++) {
                if (students.get(i).getId()%3 == 0) {
                    Student student = students.get(i);
                    students.remove(student);
                }
            }
        }
        /**
         * 使用Iterator的方式也可以顺利删除和遍历
         */
        public void iteratorRemove() {
            List<Student> students = this.getStudents();
            System.out.println(students);
            Iterator<Student> stuIter = students.iterator();
            while (stuIter.hasNext()) {
                Student student = stuIter.next();
                if (student.getId() % 2 == 0)
    //这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException stuIter.remove();
    } System.out.println(students); }
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class ListRemove {
    
        public static void main(String args[]) {
            ListRemove lr = new ListRemove();
            lr.listRemove();
            lr.listRemoveBreak();
    //        lr.listRemove2();
    //        lr.iteratorRemove();
        }
    
        /**
         * 使用增强的for循环
         * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
         */
        public void listRemove() {
            List<Student> students = this.getStudents();
            for (Student stu : students) {
                if (stu.getId() == 2) 
                    students.remove(stu);
            }
        }
        
        /**
         * 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
         */
        public void listRemoveBreak() {
            List<Student> students = this.getStudents();
            for (Student stu : students) {
                if (stu.getId() == 2) {
                    students.remove(stu);
                    break;
                }
            }
        }
        
        /**
         * 这种不使用增强的for循环,每次重新获取list的size遍历的情况运行时不会报错,但是可能删除的结果是错的。
         */
        public void listRemove2() {
            List<Student> students = this.getStudents();
            for (int i=0; i<students.size(); i++) {
                if (students.get(i).getId()%2 == 0)
                    students.remove(i);
            }
        }
        
        /**
         * 使用Iterator的方式也可以顺利删除和遍历
         */
        public void iteratorRemove() {
            List<Student> students = this.getStudents();
            System.out.println(students);
            Iterator<Student> stuIter = students.iterator();
            while (stuIter.hasNext()) {
                Student student = stuIter.next();
                if (student.getId() % 2 == 0)
                    stuIter.remove();
            }
            System.out.println(students);
        }
        
        private List<Student> getStudents() {
            List<Student> students = new ArrayList<Student>() {
                {
                    int i = 0;
                    while (i++ < 10) {
                        Student student = new Student(i, "201200" + i, "name_" + i);
                        this.add(student);
                    }
                }
            };
            return students;
        }
    }
    public class Student {
    
        private int id;
        private String stuNo;
        private String name;
        
        public Student() {
            
        }
        
        public Student(int id, String stuNo, String name) {
            this.id = id;
            this.stuNo = stuNo;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getStuNo() {
            return stuNo;
        }
    
        public void setStuNo(String stuNo) {
            this.stuNo = stuNo;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", stuNo=" + stuNo
                    + "]";
        }
        
    }
  • 相关阅读:
    springboot文件上传: 单个文件上传 和 多个文件上传
    Eclipse:很不错的插件-devStyle,将你的eclipse变成idea风格
    springboot项目搭建:结构和入门程序
    POJ 3169 Layout 差分约束系统
    POJ 3723 Conscription 最小生成树
    POJ 3255 Roadblocks 次短路
    UVA 11367 Full Tank? 最短路
    UVA 10269 Adventure of Super Mario 最短路
    UVA 10603 Fill 最短路
    POJ 2431 Expedition 优先队列
  • 原文地址:https://www.cnblogs.com/shaohz2014/p/3756860.html
Copyright © 2011-2022 走看看