2009-09-29 8 views
1

Un petit conseil s'il vous plaît.Records to Tree

Je suis en train de créer un arbre de lignes de données suivantes:

TOP  Level1  NotLeaf 
Level1  Data1  leaf 
TOP  Level11 NotLeaf 
Level11 Level2  NotLeaf 
Level11 Data4  leaf 
Level2  Data2  leaf 
Level2  Data3  leaf 

La dernière colonne indique si un nœud est une feuille ou non. Par conséquent, l'arbre, ressemblerait à ceci:

Top 
| 
|- Level1, Level11 
    |   | 
    |   | 
    Data1  Level2, Data4 
       | 
       | 
       Data2, Data3 

je stocke chaque ligne des données dans un grain et je puis mettre le grain dans une liste.

public class Data { 

    private String parent; 
    private String name; 
    private int isLeaf; 

    public Data(String parent, String name, int isLeaf){ 
    this.parent = parent; 
    this.name = name; 
    this.isLeaf= isLeaf; 

      //add to the list 
    } 

    //Getters 

    public List<Data> getDataList(){ 
     return dataList; 
    } 
} 

Maintenant, pour l'arbre, j'ai écrit une classe Node comme ci-dessous:

public class Node { 

    private final String nodeName; 
    private final List<Node> children; 

    public Node(String nodeName) { 
     this.nodeName = nodeName; 
     this.children = new ArrayList<Node>(10); 
    } 

    public String getNodeName() { 
     return nodeName; 
    } 

    public List<Node> getChildren() { 
     return Collections.unmodifiableList(children); 
    } 

    public void addChild(Node child) { 
     children.add(child); 
    } 
} 

Mais je ne peux pas sembler comprendre comment insérer les données dans le nœud et obtenir la relation comme indiqué dans l'arbre ci-dessus.

Peut-être que le manque de sommeil cache l'évidence, mais tout conseil serait très utile.

Merci

Répondre

2

Manque de moi-même dormir, donc je ne vais pas le code, mais à peu près -

  • Vous n'avez pas besoin d'une colonne disant que si quelque chose est un nœud feuille ou non. S'il n'a pas d'enfants, c'est une feuille, sinon ce n'est pas le cas.

  • Créez un noeud de début intitulé "ROOT".

  • Votre classe de noeud est correcte. Créez un HashMap<String,Node>. Chaque ligne, telle que vous l'avez écrite, contient une relation PARENT-CHILD. Vous itérez à travers vos lignes, à chaque ligne, vous le faites

  • Si la carte contient déjà un nœud nommé parent, procurez-vous-le. Sinon, créez-le et ajoutez-le à la carte. Pareil pour l'enfant. Ajoutez le noeud enfant au noeud parent. Lorsque vous créez le noeud, si le noeud est répertorié dans la colonne PARENT, vous l'ajoutez au noeud ROOT. S'il est répertorié dans la colonne enfant, vous le supprimez du nœud racine.

Après avoir analysé toutes vos lignes, les seuls enfants de la racine seront des noeuds qui sont apparus dans la colonne PARENT et non la colonne des enfants. Tout ce qui apparaît dans la colonne CHILD et non dans la colonne PARENT sera un nœud feuille. Tout ce qui apparaît dans la colonne parente ne sera pas une feuille, à moins que la liste des enfants soit nulle.

En outre, j'éviterais les étiquettes "TOP" et "LEVEL1" qui impliquent une position fixe dans l'arbre, et nous les étiquettes PARENT et CHILD. De cette façon, vous avez juste une liste de relations qui peuvent exister à n'importe quel point d'arbitrage dans l'arbre.

+0

Merci beaucoup. Créer un nœud racine et y ajouter des enfants a fait l'affaire. – CaptainHastings

0

Je ne voudrais pas séparer les données du nœud. Au lieu de cela, avoir le nœud est un composite et maintenir les informations parent. Le test pour isLeaf peut renvoyer true si children est vide. Un nœud "Top" aurait un parent nul.