Hi!
Erstmal folgender Codesnippet:
Ich habe eine Datenstruktur, die einen Baum abbildet (root, nodes und leafs), sowie ein Arbeitsverzeichnis/Ordnerstruktur abbilden soll, wobei die leafs immer files (keine Ordner) sind.
In dieser Methhode möchte ich prüfen, ob ein übergebenes File, das in meinen Baum hinzugefügt werden soll,
schon im Baum exisitiert, oder nicht.
Wir beginnen beim traversieren ganz oben in der Wurzelnode (Hauptordner).
Hier iterieren wir durch die Kinder-Nodes dieser Node und gucken in Zeile 4, ob irgendein Kinder-Node bereits ein Leaf (Repräsenator für File) ist,
d.h. selber keine weiteren Kinder-Nodes mehr hat.
Falls das so ist, dann wird geprüft, ob diese Leaf-Node == file (gem. meiner equals()_Implementierung).
Das passt so alles und im Debugger wird dann auch das boolean Attribut 'inTree' korrekt auf true gesetzt, wenn meine equals() wahr ausgibt.
Nun würde ich am liebsten alles in dieser Methode beenden und keine weiteren rekursiven Aufrufe erlauben, dh. zurück zu der Methode springen,
die quasi diese existInTree()_Methode aufgerufen hat und dabei true zurückgeben.
Jedoch passiert das nicht und im Debugger sehe ich , dass das Programm zu Erst in die letzte Zeile "return inTree") springt (hier ist inTree noch true)
und von dort zurück in die Zeile im else-Block ("existInTree(child, file)") - hier is inTree dann wieder false,
um die existInTree()-Methode wieder rekursiv aufzurufen.
Wie kann ich das verhindern, oder zumindest den True-Wert bzgl. meiner boolean Variable so lange sichern, bis wirklich alle rekursiven Aufrufe vorbei sind und ich dann eben mit true ganz am Ende returnen kann?
PS: Weiß Jemand, wie ich es hier im Forum beim Codesnippet-Posten so anstelle, dass Zeilenangaben mit angezeigt werden?
Lg,
Zrebna
Erstmal folgender Codesnippet:
Java:
public boolean existsInTree(Node root, File file) {
boolean inTree = false;
for(Node child : root.getChildren()) {
if(child.isLeaf()) {
inTree = child.equals(file);
break;
} else {
existsInTree(child, file);
}
}
return inTree;
}
Ich habe eine Datenstruktur, die einen Baum abbildet (root, nodes und leafs), sowie ein Arbeitsverzeichnis/Ordnerstruktur abbilden soll, wobei die leafs immer files (keine Ordner) sind.
In dieser Methhode möchte ich prüfen, ob ein übergebenes File, das in meinen Baum hinzugefügt werden soll,
schon im Baum exisitiert, oder nicht.
Wir beginnen beim traversieren ganz oben in der Wurzelnode (Hauptordner).
Hier iterieren wir durch die Kinder-Nodes dieser Node und gucken in Zeile 4, ob irgendein Kinder-Node bereits ein Leaf (Repräsenator für File) ist,
d.h. selber keine weiteren Kinder-Nodes mehr hat.
Falls das so ist, dann wird geprüft, ob diese Leaf-Node == file (gem. meiner equals()_Implementierung).
Das passt so alles und im Debugger wird dann auch das boolean Attribut 'inTree' korrekt auf true gesetzt, wenn meine equals() wahr ausgibt.
Nun würde ich am liebsten alles in dieser Methode beenden und keine weiteren rekursiven Aufrufe erlauben, dh. zurück zu der Methode springen,
die quasi diese existInTree()_Methode aufgerufen hat und dabei true zurückgeben.
Jedoch passiert das nicht und im Debugger sehe ich , dass das Programm zu Erst in die letzte Zeile "return inTree") springt (hier ist inTree noch true)
und von dort zurück in die Zeile im else-Block ("existInTree(child, file)") - hier is inTree dann wieder false,
um die existInTree()-Methode wieder rekursiv aufzurufen.
Wie kann ich das verhindern, oder zumindest den True-Wert bzgl. meiner boolean Variable so lange sichern, bis wirklich alle rekursiven Aufrufe vorbei sind und ich dann eben mit true ganz am Ende returnen kann?
PS: Weiß Jemand, wie ich es hier im Forum beim Codesnippet-Posten so anstelle, dass Zeilenangaben mit angezeigt werden?
Lg,
Zrebna
Zuletzt bearbeitet: