如何删除树中的无效子节点

时间:2017-10-28 09:29:27

标签: java

我在Tree级以下,具有以下属性及其getter和setter。

public class Tree {
   private String name, address;
   private List<Tree> child; 
}

我正在迭代Tree并将名称与有效名称列表进行比较。如果名称无效,我必须从主Tree中删除该特定Tree节点。但是,我不知道如何实现删除功能。

private void validateTree(Tree tree) {
    if (tree.getChild() != null && !tree.getChild().isEmpty()) {
        for(Tree node:tree.getChild()){
            if(list.contains(node.getName())){  // String elements in list
                validateTree(tree); // validate the subtree
            } else {
                // Here I have to remove the child node from the Tree.
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

最简单的方法是在removeChild()中添加Tree方法:

public class Tree {

    List<Tree> child;

    public void removeChild(Tree tree) {
        child.remove(tree);
    }
}

在您的验证方法中,您可以使用它:

 if (validNodes.contains(node.getName())) {
    validateTree(tree);
 } else {
    tree.removeChild(node);
 }

但是,当您更改正在循环的集合时,您应始终非常可疑。我强烈建议保留原始的Tree,并创建第二个有效的Tree,它只包含有效的节点。

答案 1 :(得分:1)

从集合中删除元素的安全方法是使用迭代器。在你的情况下,它可能看起来像这样:

List<Tree> children = tree.getChild();
for (Iterator<Tree> iterator = children.iterator(); iterator.hasNext();) {
    Tree node = iterator.next();
    if (list.contains(node.getName())){  // String elements in list
        validateTree(tree); //OK
    } else {
        iterator.remove();
    }
}