2016-09-19 5 views
1

Ich habe eine List von , die eine verschachtelte Liste von child nodes enthält. Ich versuche, durch alle von ihnen zu iterieren, um einen bestimmten Knoten zu finden. Derzeit beginne ich an der child nodes von der root Ebene, dann gehe eine Ebene tief zu sub child node und so weiter mit for-each Schleife. Dies ist mein Code:Sammlungen während der Iteration austauschen

List<Node> children = root.getChildren(); 
    boolean found = false; 

    while (!found) { 

     for (Node node : children) { 

      if (!node.getData().toString().toUpperCase().contains("BRANCH")) { 
       if(condition){//some processing} 
       } else { 
        //swap children with sub children 
        if (children.get(0) != null) { 
         children = children.get(0).getChildren(); // this operation is not possible during iteration 
        } 
       } 
      } else { 
       continue; 
      } 
     } 

    } 

} 

Wenn child node keine Übereinstimmung finden, dann muss ich mit sub child node die Sammlung tauschen und Iteration weiter und so weiter. Gibt es eine bessere Möglichkeit, eine verschachtelte nodelist von Kindern zu durchlaufen?

+0

Dies scheint wie ein XY-Problem. Ich würde eine Rekursion vorschlagen, aber es ist unklar, was Sie eigentlich tun wollen. –

+0

@JornVernee: Ich habe versucht, eine Java-Hierarchie-Struktur aus einer Arraylist zu erstellen und später in Json (Gson) zu konvertieren, um in der Webseite zu rendern. –

Antwort

1

Anstatt die Sammlungen zu vertauschen, können Sie die Elemente zu einer Warteschlange hinzufügen und weiterlaufen lassen, bis die Warteschlange leer ist (d. H. Sie haben keine Übereinstimmung gefunden). Oder Sie finden ein Spiel und kehren früh zurück.

public static void algorithm(Node root) { 
    Queue<Node> q = new LinkedList<>(); 
    q.add(root); 

    while(!q.isEmpty()) { 
     Node current = q.poll(); 

     if(current .getData().toString().toUpperCase().contains("BRANCH")) { 
      continue; 
     } 

     if(condition){ 
      //some processing 
      return; 
     } else { 
      q.addAll(current.getChildren()); 
     } 
    } 
} 
algorithm(root); 
+0

Das war genau das, was ich wollte. Perfekt gearbeitet. Vielen Dank! –

0

Sie können nicht wie diese Mid-Iteration austauschen. Denken Sie daran, dass Ihre for-Schleife in Java wie folgt übersetzt:

for (Iterator<Node> it = children.iterator(); it.hasNext();) { 
    Node node = it.next(); 
    // The rest of it 
} 

Also selbst wenn Sie ändern, was children ist, Ihre Iterator bleibt, wie es ist.

Ich würde vorschlagen, eine Queue zu verwenden, um Ihnen hier zu helfen.

PS Wollen Sie wirklich alle nicht-ersten Kinder überspringen? Das scheint das zu sein, was Sie gerade tun.

+0

@ Joe C: das habe ich mir auch gedacht. Auch der Baum ist riesig und es wird sehr kompliziert nach unten zu bewegen. Ich denke, ich muss einen anderen Algorithmus verwenden, wie du gesagt hast. Ich versuche nur, das erste Kind und seine Unter-Kind-Logik zur Arbeit zu bringen, bevor ich zu den anderen Kindern gehe. Ich muss vielleicht eine for-Schleife oder etwas verwenden, um alle Geschwister zu bedecken. Aber es ist schon ein Alptraum. lol –

Verwandte Themen