【发布时间】:2020-12-17 22:50:57
【问题描述】:
有一个通用的树数据结构。现在,它的 Node Class 看起来像这样。
private static class Node {
int data;
ArrayList<Node> children = new ArrayList<>();
}
DS 的形成完全是通过输入来构建的。现在我需要执行的是删除所有叶节点。下面的代码无法删除已经存在于其实例成员中的子代。
public static void removeLeaves(Node node) {
ArrayList<Node> nodeChildrenList = node.children;
int childrenSize = nodeChildrenList.size();
for(int i = 0; i < childrenSize; i++){
Node child = nodeChildrenList.get(i);
removeLeaves(child);
if(child.children.size() == 0){
child.children.remove(child); // Problem
}
}
}
我无法理解对象(节点)子节点没有从 ArrayList 中删除。但迭代器工作正常。我什至在每一步都尝试过调试。当断点到达 child.children.remove(child);线。它没有完成它。
虽然这段代码工作起来很迷人。
ArrayList<Node> nodeChildrenList = node.children;
// int childrenSize = nodeChildrenList.size();
Iterator itr = nodeChildrenList.iterator();
while(itr.hasNext()){
Node child = (Node)itr.next();
if(child.children.size() == 0){
itr.remove();
}
removeLeaves(child);
}
// for(int i = 0; i < childrenSize; i++){
// Node child = nodeChildrenList.get(i);
// removeLeaves(child);
// if(child.children.size() == 0){
// child.children.remove(child);
// }
// }
}
【问题讨论】:
-
这能回答你的问题吗? Delete data from ArrayList with a For-loop
-
一方面,当
child.children数组列表的大小为 0 时,您的 for 循环正在调用child.children.remove(child)。它已经为空。另一方面,使用迭代器就地修改,而不是 for-each 循环。后者可以产生ConcurrenctModificationException 或更糟的非确定性行为。 -
也许你的意思是
if (child.children.size() > 0) -
为什么要在列表为空时从列表中删除某些内容?为什么要从节点的子节点列表中删除节点本身?
-
@NomadMaker 我打赌OP实际上意味着如果孩子没有孩子,则将孩子本身从其父母中移除,即
if (child.children.isEmpty()) { nodeChildrenList.remove(child); }---但是,递归调用没有任何意义,因为该方法最终会删除 所有 个后代节点。
标签: java loops arraylist collections