在运行以下代码的每个循环时,我收到了并发修改异常:
if (entityList.isEmpty()) {
entityList.add(entity);
}
else {
for (Entity e: entityList) {
if (e.getName().equals(p.toString())) {
e.setOccurrence(e.getOccurrence() + 1);
}
else {
entityList.add(entity);
}
}
}
这是因为我尝试从entityList读取并在同一个线程中写入它,对吧? 我不确定如何解决使用Iterator对象的问题似乎只有在删除列表项时发生异常才有意义。
答案 0 :(得分:2)
你得到了那个例外,因为你正在修改循环中的列表(你在循环内的列表上调用add
)。
将要添加的实体放入临时列表中,并在循环后将它们添加到原始列表中:
if (entityList.isEmpty()) {
entityList.add(entity);
}
else {
List<Entity> tempList = new ArrayList<>();
for (Entity e: entityList) {
if (e.getName().equals(p.toString())) {
e.setOccurrence(e.getOccurrence() + 1);
}
else {
tempList.add(entity);
}
}
entityList.addAll(tempList);
}
答案 1 :(得分:0)
对于每个不匹配的条目,您真的是要将entity
添加到列表中吗?如果您的列表包含10个元素且只有其中一个匹配,则您将向列表中添加9个新元素。这可能不是你想要的。
考虑使用Map<String,Entity>
代替List
。
Map<String,Entity> entityMap;
......
String name = p.toString();
Entity match = entityMap.get(name);
if (match == null) {
entityMap.put(name, entity);
} else {
match.setOccurence(match.getOccurence() + 1);
}
答案 2 :(得分:0)
而不是每个样式循环或迭代器使用旧的for循环。像...
for(int index=0; index < entityList.size(); index++){
Entity e = entityList.get(index);
if (e.getName().equals(p.toString())) {
e.setOccurrence(e.getOccurrence() + 1);
}
}