ArrayList<TreeNode<T>> fortlaufende Nummerierung der Elemente

Mark99

Mitglied
Hallo ich hänge aktuelle bei der toString() Methode fest. Ich möchte alle Elemente mit fortlaufender Nummerierung ausgeben lassen, allerdings weiß ich momentan nicht, wie ich die Zahlen erhöhen soll.

Java:
public class TreeNode<T> {
    private final ArrayList<TreeNode<T>> children = new ArrayList<>();
    private T data;
   


    public TreeNode(T data) {
        this.data = data;
    }

    public void addChild(TreeNode<T> node) {
        children.add(node);
    }

    public T get() {
        return data;
    }

    public void set(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return toString("", 1);
    }

 
    public String toString(String prefix, int number) {
        StringBuilder s = new StringBuilder();


       //s.append(number);
        s.append(prefix);
        s.append(data);
        s.append("\n");

        if (prefix.equals("")){
            s.append("=================\n");
            prefix = (number) + ".";

        }else{
            prefix = "   "    + prefix + (number) + ". ";

        }


        for (int i = 0; i < children.size(); i++){
            s.append(children.get(i).toString(prefix, number));
        }


        return s.toString();
    }
       

}

public class TreeNode_Main{
    public static void main(String[] args) {
        TreeNode<String> root = new TreeNode<String>("Wissenschaften");

        TreeNode<String> node = new TreeNode<String>("praktische");
        node.addChild(new TreeNode<String>("Ethik"));
        node.addChild(new TreeNode<String>("Rhetorik"));
        node.addChild(new TreeNode<String>("Politik"));
        root.addChild(node);
        node = new TreeNode<String>("theoretische");
        root.addChild(node);
        System.out.println(root);

    }
}

Die Ausgabe sollte so aussehen:
Wissenschaft
========
1. praktische
1.1. Ethik
1.2. Rhetorik
usw.
 

Neumi5694

Top Contributor
Vorweg: Gib jedem Node einen Verweis auf seinen Parent mit. Auch TreeNode_Main muss ein Parent sein, schließlich beinhaltet es Nodes.

Dann kannst du das Ganze rekursiv lösen mit einer Methode, die eine Liste von Integern liefert.

Ist der Parent ein TreeNode_Main, dann frag beim Parent nach, welchen Index in der Liste das aktuelle Element hat. Dies ist der erste Eintrag in der Integer-Liste und wird als Ergebnis geliefert.
Ist der Parent hingegen ein TreeNode, dann ruf zuerst die Methode für den Parent auf. Dann frag beim Parent nach, welchen Index in der Liste das aktuelle Element hat. Diesen Index fügst du der Liste des vorigen Aufrufs hinzu. Liefere diese Liste jetzt als Ergebnis.


Wenn die Nodes ihre Parents nicht kennen, dann musst du jedesmal die komplette Liste durchlaufen, um den Branch zu finden, in dem der Node sich befindet. Das geht dann mit Schleifen und Prüfungen, ob es Leafes gibt. Das Ergebnis, bzw. die Zwischenergebnisse werden ebenfalls in einer Liste abgespeichert.

So oder so: Als letztes wirst du eine Liste von Indizes haben, die jeweils mit 0 beginnen. Für die Ausgabe zähle jeweils 1 dazu oder ersetze sie durch Buchstaben oder was immer dir sonst noch vorschwebt (kann sich natürlich auch nach Position in der Liste unterscheiden).
Wenn irgendwo mal -1 steht, dann hast du bei den Parents nicht sauber gearbeitet, denn der Parent beinhaltet dann nicht das Child, das auf den Parent verwiesen hat.
 
Zuletzt bearbeitet:

Mark99

Mitglied
Vorweg: Gib jedem Node einen Verweis auf seinen Parent mit. Auch TreeNode_Main muss ein Parent sein, schließlich beinhaltet es Nodes.

Dann kannst du das Ganze rekursiv lösen mit einer Methode, die eine Liste von Integern liefert.

Ist der Parent ein TreeNode_Main, dann frag beim Parent nach, welchen Index in der Liste das aktuelle Element hat. Dies ist der erste Eintrag in der Integer-Liste und wird als Ergebnis geliefert.
Ist der Parent hingegen ein TreeNode, dann ruf zuerst die Methode für den Parent auf. Dann frag beim Parent nach, welchen Index in der Liste das aktuelle Element hat. Diesen Index fügst du der Liste des vorigen Aufrufs hinzu. Liefere diese Liste jetzt als Ergebnis.


Wenn die Nodes ihre Parents nicht kennen, dann musst du jedesmal die komplette Liste durchlaufen, um den Branch zu finden, in dem der Node sich befindet. Das geht dann mit Schleifen und Prüfungen, ob es Leafes gibt. Das Ergebnis, bzw. die Zwischenergebnisse werden ebenfalls in einer Liste abgespeichert.

So oder so: Als letztes wirst du eine Liste von Indizes haben, die jeweils mit 0 beginnen. Für die Ausgabe zähle jeweils 1 dazu oder ersetze sie durch Buchstaben oder was immer dir sonst noch vorschwebt (kann sich natürlich auch nach Position in der Liste unterscheiden).
Wenn irgendwo mal -1 steht, dann hast du bei den Parents nicht sauber gearbeitet, denn der Parent beinhaltet dann nicht das Child, das auf den Parent verwiesen hat.
Also die Aufgabe selbst ist von einer Seite. Das einzige was man selbst programmieren soll, ist die toString(String prefix, int number) Methode.
Als Hinweis stand dabei, dass es nicht viel Code bedarf und nur eine for Schleife.
Ich dachte, dass man den Index der for-Schleife übergeben kann, allerdings klappt das nicht.
 

Neumi5694

Top Contributor
Also die Aufgabe selbst ist von einer Seite. Das einzige was man selbst programmieren soll, ist die toString(String prefix, int number) Methode.
Als Hinweis stand dabei, dass es nicht viel Code bedarf und nur eine for Schleife.
Ich dachte, dass man den Index der for-Schleife übergeben kann, allerdings klappt das nicht.
Ich tendier dazu, alle möglichen Szenarien abzudecken, da wird's manchmal etwas komplizierter :)
Meine Lösung wäre dafür da gewesen, den Index eines Nodes zu bestimmen. Wenn man allerdings alle auflisten will, geht's natürlich auch einfacher.
Hab mir nochmal die toString Methode und vor allem den Prefix angeschaut.
Eine mögliche Lösung:
Die Zahl nach dem Punkt kommt von außen als Int und entspricht dem Index in der Node-Liste, der Prefix ist so was wie "1." oder "2." (oder im ersten Schritt leer).
Wenn du dann die Unternodes aufrufst, übergibst du als Prefix format("%s%d.",prefix,index)
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben