2017-10-28 11 views
1

以下の属性とそのgetterとsetterを持つTreeクラスがあります。ツリー内の無効な子ノードを削除するにはどうすればいいですか

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. 
      } 
     } 
    } 
} 
+1

あなたのコードはどうですか? –

+0

あなたは直面している問題は何ですか?あなたの質問に、現在動作していないコードを含む完全なソースコードを追加してください。 – Progman

+0

validateTreeメソッドを追加しました。私はそれが条件と一致しない場合、ツリーから要素を削除する方法を取得していません。 – RBP

答えて

2

最も簡単な方法は、あなたのTreeremoveChild()方法を追加することです:

あなたがそれを使用することができ、あなたの検証方法で
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を元のままにし、有効なノードのみを含む2番目の有効なTreeを作成することを強くお勧めします。

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(); 
    } 
} 
関連する問題