2016-11-10 2 views
0

Ich habe eine interessante und wie ich es verstehe nicht die einfachste Aufgabe.Baum der Java-Objekte basierend auf einer Liste von Strings, die Hierarchie darstellen

Ich muss einen Baum von Objekten basierend auf einer Liste von Strings erstellen, die Hierarchie darstellen.

Zum Beispiel Strings in der Liste ist (tatsächlich könnte es ein Graph):

List<String> hierarchies; 

1 # 1 # 2 # 1 # 2 # 3 # 1 # 2 # 4 # 1 # 2 # 4 # 5 #

Klasse I haben:

class Tree { 

    List<Tree> children; 

    // here is getter 

} 

ich habe einige Implementierung aber nur für den Start. Ich weiß nicht, wie ich diesen Code fertigstellen soll. Kannst du deine Vision mit mir teilen?

Vielen Dank im Voraus!

Tree tree = null; 

for (String hierarchy : hierarchies) { 

    if (hierarchy.equals("1#")) { 
     tree = new Tree(); 
    } else { 
     tree.getChildren().add(new Tree()); 
    } 

} 

return tree; 
+1

Können Sie ein Bild (in ASCII-Art) zeichnen, wie der Baum aussehen sollte, wenn Sie die Beispieleingabe verwenden, die Sie angegeben haben? – martijnn2008

Antwort

0

Es gibt viele mögliche Lösungen. Ohne Komplexität kann es wie folgt aussehen:

public void testHierarchy() { 

    List<String> hierarchies = new ArrayList<String>(); 

    hierarchies.add("1#"); 
    hierarchies.add("1#2#"); 
    hierarchies.add("1#2#3#"); 
    hierarchies.add("1#2#4#"); 
    hierarchies.add("1#2#4#5#"); 

    Tree root = new Tree(); 
    for (String hierarchy : hierarchies) { 
     String[] elHierarchy = hierarchy.split("#"); 
     processLevel(elHierarchy, root); 
    } 
} 

private void processLevel(String[] hierarchy, Tree rootTree) { 

    if (null == rootTree.getValue() || "".equals(rootTree.getValue())) { 
     rootTree.setValue(hierarchy[0]); 
    } 

    Tree nextChild = null; 
    for (Tree child : rootTree.getChildren()) { 
     if (child.getValue().equals(hierarchy[1])) { 
      nextChild = child; 
      break; 
     } 
    } 

    if (hierarchy.length > 1) { 
     if (null == nextChild) { 
      nextChild = new Tree(); 
      nextChild.setValue(hierarchy[1]); 
      rootTree.getChildren().add(nextChild); 
     } 
     String[] remainHierarchy = new String[hierarchy.length - 1]; 
     System.arraycopy(hierarchy, 1, remainHierarchy, 0, remainHierarchy.length); 
     processLevel(remainHierarchy, nextChild); 
    } 
} 

private static class Tree { 
    String value; 
    List<Tree> children = new ArrayList<SometestTest.Tree>(); 

    public List<Tree> getChildren() { 

     return children; 
    } 

    public String getValue() { 

     return value; 
    } 

    public void setValue(String value) { 

     this.value = value; 
    } 

} 

P.S. Nicht zu elegant, aber einfach.

+0

Vadim, es hat wirklich geholfen. Vielen Dank! –

+0

Sie immer willkommen – Vadim

Verwandte Themen