当前位置: 首页 > 知识库问答 >
问题:

ConcurrentModificationException同时使用嵌套的for-each移除元素

扈德容
2023-03-14
EmployeeID,FirstName,LastName,Dept
1, John, Smith, Maintenance 
1, John, Smith, Engineering 
1, John, Smith, Transport 

从CSV文件中,我读取每一行并创建一个employee对象,然后将其存储到employee的ArrayList中。

在对员工的排序之前:

employeeID='1', firstName='John', lastName='Smith', department='Maintenance'}
employeeID='1', firstName='John', lastName='Smith', department='Engineering'}
employeeID='1', firstName='John', lastName='Smith', department='Transport'}

一旦文件处理完成,我就开始对员工的。

employeeID='1', firstName='John', lastName='Smith', department='Maintenance, Engineering, Transport'}
Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
    at com.gillott.csvtomap.CsvToMap.employeeSorter(CsvToMap.java:73)
    at com.gillott.csvtomap.CsvToMap.main(CsvToMap.java:34)
for (Employee emp1: employees) {

    for (Employee emp2: employees){

        if(emp1.getEmployeeID().equals(emp2.getEmployeeID())){

            emp1.setdepartment(emp1.getdepartment() + ", " + emp2.getdepartment());
            System.out.println("Duplicate found for Employee ID: " + emp1.getEmployeeID());
            employees.remove(emp2); //CME Exception Throw here.
        }
    }
}

循环迭代器示例:

for (Iterator<Employee> employeeIterator1 = employees.iterator(); employeeIterator1.hasNext();) {
    Employee emp1 = employeeIterator1.next();

    for (Iterator<Employee> employeeIterator2 = employees.iterator(); employeeIterator2.hasNext();){
        Employee emp2 = employeeIterator2.next();

        if(emp1.getEmployeeID().equals(emp2.getEmployeeID())){

            emp1.setdepartment(emp1.getdepartment() + ", " + emp2.getdepartment());
            System.out.println("Duplicate found for Employee ID: " + emp1.getEmployeeID());
            employeeIterator1.remove();
        }
    }
}

我的迭代器的实现可能是不正确的,这是第一次直接使用迭代器。

共有1个答案

养学
2023-03-14

按id对雇员进行分组,并使用下游收集器合并实例:

Map<Integer, Employee> map =
    employees.stream()
        .collect(groupingBy(
            Employee::getId,
            reducing((a, b) -> a.setdepartment(a.getdepartment() + "," + b.getdepartment()));

然后在employees中保留实例,这些实例是此映射中的值:

employees.retainAll(map.values());

如果您愿意,您可以在一个语句中完成所有这些。

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

  • 问题内容: 我想嵌套每个XML元素。 请看以下示例: 它将返回以下XML: 这不是我想要XML格式化的方式。而是我希望每个元素都被如下所示的元素包裹: 这家伙有帮助吗? 问题答案: 好的,这是代码。 这是输出。 祝你好运…

  • 我有一个自定义列表类的应用程序。当尝试使用customer参数执行foreach函数时,会发生以下情况: 错误:

  • 问题内容: 如果在使用for- each循环遍历Collection的同时修改了它,它会给出。有什么解决方法吗? 问题答案: 使用。 这是在迭代过程中修改集合的唯一安全方法。有关更多信息,请参见“收集接口”教程。 如果还需要在迭代时 _添加_元素的功能,请使用。

  • 我有两个线程:第一个是渲染线程,第二个线程是我处理UI动作的主线程。 我得到以下错误: ConcurrentModification异常的常见原因是迭代列表的更改,但我只在函数中读取它。唯一可能更改的地方是方法,但是和都在同步块内调用 也许我不明白。。那么这个错误是如何出现的呢? 我的代码: 谢谢你的评论!我将整理我的代码-在中添加同步块,并检查是否可以从另一个同步块调用。

  • 问题内容: 我遇到了非常奇怪的Java行为,但我不知道这是一个bug,还是我错过了一些东西。 该代码只需遍历stateStack(LinkedList)列表并销毁所有状态。 引发了以下异常: 该代码通常可以正常工作,并且已经投入生产一年多了。 这可能是Java错误吗? / 更新 / destroy()调用不会修改stateStack。如果可以的话,我猜Java会抛出ConcurrentModifi