在递归迭代时从列表中删除一个元素会抛出异常
Deletenig an element from a list while it's being iterated recursively throws exception
我有以下代码:
private void deletePersonFromList(String dni, ObservableList<Persona> persons){
for(Persona p : persons){
if(p.getChildren().isEmpty()) {
if(p.getDNI().equals(dni)) {
persons.remove(p);
}
} else deletePersonFromList(dni, p.getChildren());
}
}
我想做的是删除列表中符合条件的元素,这是递归完成的,因为所述元素本身可以包含元素列表。
这样做会抛出 java.util.ConcurrentModificationException,因为正在迭代列表。什么方法可以帮助我做到这一点?
这是我在做学校作业时遇到的问题,所以请不要只用代码解决它来回答(如果可能的话),我想了解在这种情况下我应该怎么做以及为什么。
提前致谢!
你应该使用 Iterator
而不是 foreach:
public static void main(String[] args) throws Exception {
final List<String> list = new ArrayList<>(of("a", "b", "c"));
final Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
final String value = iterator.next();
iterator.remove();
System.out.println("List: " + list + "\tRemoved: " + value);
}
}
for (Iterator<Persona> iter = persons.iterator(); iter.hasNext(); ) {
Persona p = iter.next();
if (p.getChildren().isEmpty()) {
if (p.getDNI().equals(dni)) {
iter.remove();
}
} else deletePersonFromList(dni, p.getChildren());
}
使用 for-each through persons 维护状态。
我有以下代码:
private void deletePersonFromList(String dni, ObservableList<Persona> persons){
for(Persona p : persons){
if(p.getChildren().isEmpty()) {
if(p.getDNI().equals(dni)) {
persons.remove(p);
}
} else deletePersonFromList(dni, p.getChildren());
}
}
我想做的是删除列表中符合条件的元素,这是递归完成的,因为所述元素本身可以包含元素列表。
这样做会抛出 java.util.ConcurrentModificationException,因为正在迭代列表。什么方法可以帮助我做到这一点?
这是我在做学校作业时遇到的问题,所以请不要只用代码解决它来回答(如果可能的话),我想了解在这种情况下我应该怎么做以及为什么。
提前致谢!
你应该使用 Iterator
而不是 foreach:
public static void main(String[] args) throws Exception {
final List<String> list = new ArrayList<>(of("a", "b", "c"));
final Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
final String value = iterator.next();
iterator.remove();
System.out.println("List: " + list + "\tRemoved: " + value);
}
}
for (Iterator<Persona> iter = persons.iterator(); iter.hasNext(); ) {
Persona p = iter.next();
if (p.getChildren().isEmpty()) {
if (p.getDNI().equals(dni)) {
iter.remove();
}
} else deletePersonFromList(dni, p.getChildren());
}
使用 for-each through persons 维护状态。