当前位置: 首页 > 面试题库 >

使用迭代器并删除时出现ConcurrentModificationException错误

陶锋
2023-03-14
问题内容

我从下面的代码中获得java.util.ConcurrentModificationException,我可以找到原因。我可以成功地从csv文件读取数据,并创建一个名为课程列表的arraylist。那么我需要将其排序到一个数组列表,该数组的每个单元格都包含相同课程(名称相似的课程)的数组列表。但是当我运行它时会生成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();
    }


}

这是我的CourefileSorterclass:

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;
        }
    }




}

问题答案:

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

排序方法如下所示:

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对象。



 类似资料:
  • 这段代码应该创建一组数字(集合),将20个不同的数字放入其中,并从集合中删除所有大于1的数字。但当我运行它时,出现了一个错误:ConcurrentModificationException,

  • 即使使用迭代器,删除列表中的第1和第2个元素也会出现问题。 我已经阅读了以下的线索,但无法解决我的问题(这些是最相关的,但我也检查了其他材料): 尝试从列表中移除元素时的ConcurrentModificationException

  • 问题内容: 一段时间以来,我一直在努力解决此错误,而且我不知道问题出在哪里。我的代码是这样的: 它在remove调用上引发IllegalStateException。 我一直在想问题是否会出现,因为我要删除列表的最后一项,但即使在过程的中间,它似乎也会出错。 你们能给我一个解释吗? 问题答案: 您正在从内部循环内部的列表中删除一个元素。这意味着您的内部循环可能会尝试两次删除相同的元素,这将解释您遇

  • 问题内容: 现在,我有一个包含以下代码的程序: 就遍历ArrayList而言,我这样做是否正确? 我得到的错误是: 我将显示其余的代码,但内容相当广泛,如果我没有正确进行迭代,我将认为唯一的可能性是我没有正确初始化。 问题答案: 就遍历Arraylist而言,我这样做是否正确? 否:通过在每次迭代中调用两次,您将始终获得新的迭代器。 编写此循环的最简单方法是使用for- each 构造: 至于 您

  • 问题内容: 我下面有以下代码 现在我正在使用一个Android游戏,并且上面的代码以多线程方式运行。现在我有一个例外。我已经研究了如何解决问题,但似乎对我没有帮助。我在上面的代码上所做的是 随机删除一个条目 。我如何在那里实现它? 问题答案: 除非使用,否则不能在迭代时从集合中删除元素。 这就是导致异常的原因。 使用Iterator#remove()在遍历集合时删除元素,例如 编辑 :(响应OP的

  • } 正如您所看到的,RetryHandler扩展了线程,该线程在内部列表上迭代。尽管使用了和,我还是得到了和已在其他