【洞库】迭代集合的同时修改它报错ConcurrentModificationException

 错误java.util.ConcurrentModificationException通常发生当我们试图在迭代一个集合(如列表)的同时修改它。
 下面代码,在外层循环中迭代list,在内层循环中迭代yearData,并在某些条件下向yearData添加新的元素,这就引起了ConcurrentModificationException错误。

for (MonthHumidity data : list) {
    for (MonthTemHum th : yearData) {
        if (th.getMonth().equals(data.getMonth())) {
            th.setAvgHumidity(data.getAvgHumidity());
            th.setWetDays(data.getWetDays());
            th.setDryDays(data.getDryDays());
        } else {
            MonthTemHum monthData = new MonthTemHum();
            monthData.setAvgHumidity(data.getAvgHumidity());
            monthData.setWetDays(data.getWetDays());
            monthData.setDryDays(data.getDryDays());
            yearData.add(monthData);  // 这里修改了列表
        }
    }
}

解决办法
 先收集所有要添加的元素,然后在循环外部将它们添加到集合中。

List<MonthTemHum> toAdd = new ArrayList<>();

for (MonthHumidity data : list) {
    boolean matched = false;
    for (MonthTemHum th : yearData) {
        if (th.getMonth().equals(data.getMonth())) {
            th.setAvgHumidity(data.getAvgHumidity());
            th.setWetDays(data.getWetDays());
            th.setDryDays(data.getDryDays());
            matched = true;
            break;
        }
    }
    if (!matched) {
        MonthTemHum monthData = new MonthTemHum();
        monthData.setAvgHumidity(data.getAvgHumidity());
        monthData.setWetDays(data.getWetDays());
        monthData.setDryDays(data.getDryDays());
        toAdd.add(monthData);
    }
}

yearData.addAll(toAdd);

 上述代码首先为要添加的元素创建一个新的列表toAdd。在双循环中,如果没有匹配项,就将元素添加到toAdd列表中,而不是直接修改yearData。在循环结束后,我们将toAdd中的所有元素一次性添加到yearData中,从而避免了异常。

posted @ 2023-08-29 15:27  钱有学  阅读(17)  评论(0)    收藏  举报