【问题标题】:getting ConcurrentModificationException error while using iterator and remove使用迭代器和删除时出现 ConcurrentModificationException 错误
【发布时间】:2013-03-27 05:05:39
【问题描述】:

我从以下代码中得到一个 java.util.ConcurrentModificationException,我可以找到原因。我可以成功地从 csv 文件中读取数据并制作一个名为 course list 的数组列表。然后我需要将我分类到一个数组列表中,其中每个单元格都包含一个相同课程的数组列表(具有相似名称的课程)。 但是当我运行它时会生成 ConcurrentModificationException 我不明白为什么......

public class CourseLister {
    private static final String DATA = "data\\data.csv";
    File file;
    ArrayList<Course> courseList ; 

    public CourseLister(String filepath) {
        file = new File(filepath);
        courseList = new ArrayList<>();
    }

    public void readFromCsv(){
        // in this method a Csv file is written line by line , create a new object of course with some attribute such as name , number, instructor,... and is added to courseList //}

        }



    public Iterator<Course> getCourseIterator(){
        return courseList.iterator();
    }


    public ArrayList<Course> getCourseList(){
                return courseList;
    }

    public static void main(String [ ] args){

        CourseLister courseLister = new CourseLister(DATA);
        courseLister.readFromCsv();
        CourseFileSorter coursefilesoreter = new CourseFileSorter(courseLister.getCourseIterator());
        ArrayList<Course> curseList = courseLister.getCourseList();
        for (Course course : curseList) {
            System.out.println(course.getSemester());
        }
        System.out.println(curseList.size());
        coursefilesoreter.displayCategorizedList();
    }


}

这是我的 CourefileSorter 类:

public class CourseFileSorter {

    Iterator<Course> courseItr ;

    public CourseFileSorter(Iterator<Course> courseItr) {
        this.courseItr = courseItr;
    }

    public ArrayList<ArrayList<Course>> getSourtedLists(){

        Iterator<Course> dissimilarCourseItr = null;
        ArrayList<Course> identicalCourseList = new ArrayList<Course>();
        ArrayList<Course> dissimilarCourseList = new ArrayList<Course>();
        ArrayList<ArrayList<Course>> categorizedCourseList = new ArrayList<ArrayList<Course>>();
        Course firstCourse = null;
        Course currentCourse ;
        if(courseItr.hasNext()){
        while(courseItr.hasNext()){
            firstCourse = courseItr.next();
            identicalCourseList.add(firstCourse);
            while(courseItr.hasNext()){
                currentCourse = courseItr.next();
                if(currentCourse.getCourseName().equals(firstCourse.getCourseName())){
                    identicalCourseList.add(currentCourse);
                    courseItr.remove();                 
                }
                else{
                    dissimilarCourseList.add(currentCourse);
                }
            }
            dissimilarCourseItr = dissimilarCourseList.iterator();
            courseItr = dissimilarCourseItr;
            categorizedCourseList.add(identicalCourseList);         
        }
        return categorizedCourseList;
        }
        else{
            return null;
        }
    }




}

【问题讨论】:

  • 您是否需要将它们作为 ArrayList>?
  • 为什么在getSourtedLists 方法中调用courseItr.hasNext() 两次?
  • 你从来没有调用过getSourtedLists() 方法,那么这个异常到底是在哪里抛出的呢?你能发布你的堆栈跟踪吗?

标签: java iterator


【解决方案1】:

将它们分类为不同的数据结构会容易得多。我看到course 有一个getCourseName() 方法,我假设它会返回一个String 对象。尝试改用Map&lt;String, List&lt;Course&gt;&gt;

排序方法如下所示:

public Map<String, List<Course>> getSourtedLists(){
    Map<String, List<Course>> result = new HashMap<String, List<Course>>();
    while(courseItr.hasNext()) {
        course next = courseItr.next();
        if (!result.containsKey(next.getCourseName())) {
            result.put(next.getCourseName(), new ArrayList<Course>());
        }
        result.get(next.getCourseName()).add(next);
}

另外,您真的不想调用 courseItr.remove(); 这会从基础集合中删除 course 对象,这意味着您计划这样做的方式会清空 courseList 从您的 CourseLister对象。

【讨论】:

  • 谢谢,非常简短,帮助满满。
【解决方案2】:

1 .你得到 ConcurrentModificationException 因为:

dissimilarCourseList.add(currentCourse);

courseItr = 不同的CourseItr;

2 。当你有数组列表时使用迭代器不是一个好主意。

【讨论】:

  • @jlordo item 1 - 现在已更改。第 2 项 - 代码看起来很匆忙且不可读,并且有这样的异常
  • 1.好发现! 2. 如果您想遍历List 并可能删除元素,那么Iterator 是最好的主意。
  • @jlordo 1. 谢谢 2. 也许在一些通用代码中;在这种特殊情况下..您已经知道:) 顺便说一句,考虑在同一个列表上的两个迭代器(考虑到删除) - 如果另一个执行他的删除工作,一个将失败。
  • 如果不是因为第 (2) 项没有动机且不正确,我会对此表示赞同。
猜你喜欢
  • 2023-03-10
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2014-05-23
  • 1970-01-01
  • 2011-07-05
  • 2013-07-15
相关资源
最近更新 更多