在递归迭代时从列表中删除一个元素会抛出异常

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 维护状态。