2016-03-18 6 views
0

ich den folgenden Code (Entschuldigungen ist es ein wenig lang) haben, die funktioniert:Einfügen von Teilbäume an einen Baumknoten

public class Node { 
     public String name; 
     public List<Node> children = new ArrayList<>(); 
    } 

    private Node root = new Node(); 

    public static void main(String[] args) 
    { 
     TestCreateHierarchy obj = new TestCreateHierarchy(); 
     obj.run(); 
    } 

    public void run() 
    { 
     List<List<String>> objects = new ArrayList<>(); 

     String[] str = {"Person","Manager","Hourly","New"}; 
     objects.add(Arrays.asList(str)) ; 

     String[] str2 = {"Person","Manager","Salary","Hello"}; 
     objects.add(Arrays.asList(str2)) ; 

     String[] str3 = {"Person","Manager","Salary", "New"}; 
     objects.add(Arrays.asList(str3)) ; 

//  String[] str4 = {"Person","Manager","Salary", "New", "John"}; 
//  objects.add(Arrays.asList(str4)) ; 

     root.name = "ROOT"; 

     for (List<String> seq : objects) { 
      LOG.debug("------------- NEW SEQUENCE -----------"); 
      LOG.debug(seq); 
      LOG.debug("--------------------------------------"); 

      insert(seq); 

//   break; 
     } 

     LOG.debug(root.children.size() + " <-- should be 1 "); 

    } 

    public Node createNode(List<String> seq, Integer start) 
    { 
     if (start >= seq.size()) 
      return null; 

     Node node = new Node(); 
     node.name = seq.get(start); 
     node.children.add(createNode(seq, start+1)); 

     return node; 
    } 


    public void insert(List<String> seq) { 

     List<Node> children = root.children; 

     // Where should we start to build the tree (how 
     // deep into the sequence?) 
     int start = 0 ; 

     // Find the right place to add 
     for (int i=0; i<seq.size(); i++) { 
      boolean foundMatchingNode = false; 

//   if (children.size() == 0) 
//    continue; 

      if (children.size() > 0) { 
       for (Node node : children) { 

        LOG.debug("HERE --> " + node.name); 

        if (node.name.equals(seq.get(i))) { 
         children = node.children; 
         foundMatchingNode = true; 
         break; 
        } 
       } 
      } 

      if (!foundMatchingNode) { 
       children.add(createNode(seq,i)); 
       break; 
      } 
     } 

    } 

Mein Problem ist, dass, wenn ich den str4 Teil Kommentar-, erhalte ich ein NullPointerException Bezug zu der insert Methode, speziell zu dem for (Node node : children) Teil.

Was muss ich ändern, damit dieser Code mit verschiedenen Hierarchietiefen funktioniert?

+0

Können Sie bitte erklären, was Sie zu tun versuchen? (sei spezifisch ... erkläre, was du erwartest, dass der 'Baum' nach jedem Schritt aussieht) – HeavyE

Antwort

0

Das Problem ist in dieser Funktion:

public Node createNode(List<String> seq, Integer start) 
{ 
    if (start >= seq.size()) 
     return null; 

    Node node = new Node(); 
    node.name = seq.get(start); 
    node.children.add(createNode(seq, start+1)); 

    return node; 
} 

Sie sind ein Kind zu jedem neu erstellten Knoten rekursiv und für den letzten Funktionsaufruf hinzugefügt werden, wobei diese Bedingung erfüllt (start >= seq.size()) Sie ein null Kind erstellen.

Also, nach dem Einfügen von str1 sieht Ihr Baum wie folgt aus: ROOT->Person->Manager->Hourly->New->NULL. Wenn Sie nun versuchen, den str4 einzugeben, kommt Ihre Logik zum Überprüfen des übereinstimmenden Knotennamencodes ins Spiel. Die Schleife läuft gut für Einträge: Person, -Manager, Stündlich, New, bis sie für den Knoten läuft, die NULL ist. In der inneren for-Schleife for (Node node : children) haben Sie dieses Debugger-Protokoll: LOG.debug("HERE --> " + node.name);. An diesem Punkt erhalten Sie NullPointerException, da Ihre nodenull ist.

+0

Netter Fang, danke! – David

0

Die createNode-Methode erstellt das Hinzufügen eines Null-untergeordneten Elements zum Blatt. Die NullPointerException tritt auf, weil der Knoten selbst Null ist, wenn Sie an den unteren Rand der Struktur gelangen.

Wenn dies nicht genug von einem Hinweis ist, bitte fragen Sie nach mehr.