【发布时间】:2020-09-02 14:42:46
【问题描述】:
CSV 输入文件。
EmployeeID,FirstName,LastName,Dept
1, John, Smith, Maintenance
1, John, Smith, Engineering
1, John, Smith, Transport
我从 CSV 文件中读取每一行并创建一个员工对象,然后将其存储到员工的 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'}
使用 For-Each 和嵌套的 For-Each,我比较 EmployeeID,如果找到匹配项,我将副本的部门附加到原始副本并删除副本。显然,当我修改列表时,我正在迭代,然后我得到一个 ConcurrentModificationException。
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 -每个?请参阅 For-Each 实现和 For-Each 与 Iterator 实现。
-
For循环示例:
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-Loop 示例:
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(); } } }
我的迭代器实现可能不正确,这是第一次直接使用迭代器。
【问题讨论】:
标签: java loops foreach concurrency iterator