从列表中删除一个元素,当它被递归迭代时抛出异常

时间:2017-12-15 09:46:31

标签: java list recursion java.util.concurrent

我有以下代码:

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,因为正在迭代列表。什么方法可以帮助我做到这一点?

这是我在学校工作时面临的一个问题,所以请不要只用解码它的代码(如果可行)来回答,我想了解在这种情况下我该怎么做以及为什么。

提前致谢!

2 个答案:

答案 0 :(得分:3)

您应该使用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);
        }
    }  

答案 1 :(得分:1)

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());
}

通过每个人来维持一个国家。