【问题标题】:Deletenig an element from a list while it's being iterated recursively throws exception递归迭代时从列表中删除元素会引发异常
【发布时间】:2017-12-15 09:46:30
【问题描述】:

我有以下代码:

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

这是我在完成学校作业时遇到的一个问题,所以请不要只用代码解决它来回答(如果可能的话),我想了解在这种情况下我应该怎么做以及为什么。

提前致谢!

【问题讨论】:

  • 这里不是问软件问题,请联系电报支持者
  • 这不是软件问题,而是关于 API,而不是软件本身。

标签: java list recursion java.util.concurrent


【解决方案1】:

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

【讨论】:

  • 我正要自己回答我的问题,因为我刚刚意识到这一点并且它奏效了。我会接受你的问题作为答案,因为你更快。谢谢
  • 我要等 23 小时才能获得赏金
【解决方案2】:
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 个人可以维持一个状态。

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2011-07-04
    • 2016-07-19
    • 2011-04-02
    • 1970-01-01
    • 2015-06-30
    • 2020-11-25
    • 2016-11-21
    相关资源
    最近更新 更多