Rekursives suchen im TreeMenu

Status
Nicht offen für weitere Antworten.

Milo

Bekanntes Mitglied
Hallo,

ich habe eine Methode, die das Baummenü nach einem Eintrag durchsucht und mir den Knoten zurück geben soll. Leider läuft die Methode "zu weit" und gibt immer null zurück.

Code:
	private TreeNode getTreeNodeByName(TreeNode node, String nodeName) {
		System.out.println("SUCHE: "+nodeName+"  -->  " +  node.toString()+"  "+node.toString().equals(nodeName));
		if (node.toString().equals(nodeName))
			return node;
		else {
			for (int i=0; i<node.getChildCount(); i++)
				this.getTreeNodeByName(node.getChildAt(i), nodeName);
			return null;
		}
	}

Wenn er den Eintrag findet, bricht die Methode nicht ab, sondern durchläuft weiterhin den gesamten Baum. Warum endet sich nicht beim return?

Gruß Micha
 

Wildcard

Top Contributor
Code:
this.getTreeNodeByName(node.getChildAt(i), nodeName);
Hier musst du prüfen ob !=null und dann gegebenenfalls returnen
 
S

SlaterB

Gast
> for (int i=0; i<node.getChildCount(); i++)
> this.getTreeNodeByName(node.getChildAt(i), nodeName);

in diesem Teil findet sich gar kein return, ziemlich kaputt,

ansonsten wird ein return in Zeile 4 selbstverständlich ausgeführt, falls Zeile 3 true ergibt,

bei der Frage und den Ungenauigkeiten im Code sind alle möglichen Fehler und falsche Interpretationen denkbar..
 

Milo

Bekanntes Mitglied
Hi,

ganz ideal scheint es noch nicht zu sein:

Code:
	private TreeNode getTreeNodeByName(TreeNode node, String nodeName) { 
		//System.out.println("SUCHE: "+nodeName+"  -->  " +  node.toString()+"  "+node.toString().equals(nodeName)); 
		if (node.toString().equals(nodeName)) {
			System.out.println("1. TREFFER! " +node);
			return node; 
		}
		else { 
			for (int i=0; i<node.getChildCount(); i++) {
				TreeNode newNode = this.getTreeNodeByName(node.getChildAt(i), nodeName);
				if (newNode != null) {
					if (newNode.toString().equals(nodeName)) {
						System.out.println("2. TREFFER! "  +newNode);
						return newNode;
					}
//					else
//						this.getTreeNodeByName(newNode, nodeName);
				}
					
			}
		} 
		return null;
	}

Die Ausgabe ist:
Code:
1. TREFFER! Neupunkte
2. TREFFER! Neupunkte
Neupunkte
1. TREFFER! 1. Winkelgruppe
2. TREFFER! 1. Winkelgruppe
2. TREFFER! 1. Winkelgruppe
1. Winkelgruppe


Das Menü sieht wie folgt aus:
Code:
Root
 |--Neupunkte
 |   |----1DPunkte
 |   |----2DPunkte
 |
 |--Winkel
    |----1. Winkelgruppe

Neupunkte ist also ein Knoten, der direkt nach dem Wurzelelement kommt und weitere Kinder hat. Die 1. Winkelgruppe ist hingegen in der dritten (letzten) Ebene und hat keine Kinder mehr.

Code:
System.out.println( getTreeNodeByName(this.root, "Neupunkte") );
System.out.println( getTreeNodeByName(this.root, "1. Winkelgruppe") );

Warum werden die "Treffer" so oft ausgegeben? Sollte nicht beim ersten jeweils schon schluß sein?

Micha
 
S

SlaterB

Gast
in Zeile 9 rufst du rekusiv die Methode nocchmal auf
> TreeNode newNode = this.getTreeNodeByName(node.getChildAt(i), nodeName);

dann wird für eine untere Ebene irgendwann was gefunden, eine Ausgabe gemacht und der Knoten zurückgegeben,
oder es kommt null zurück

nun bist du wieder in einer höheren Rekursionsstufe am Ende von Zeile 9, quasi in Zeile 10,
in newNode steht nun entweder null (weitermachen) oder der richtige Knoten (dann gabs schon eine Ausgabe),
und was machst du in Zeile 12? gibst nochmal Treffer aus, obwohl doch garantiert schon mindestens einmal Treffer ausgegeben wurde

Zeile 12 kann komplett weg, Zeile 11 und 14-16 sind auch ohne Bedeutung, stören bisher aber nicht
 

Milo

Bekanntes Mitglied
Hi,

sei mir nicht böse aber verszanden habe ich nichts von dem was Du beschrieben hast. ;-)
Ich versuch nachher noch mal...

Gruß Micha

Nachtrag: Deine Änderungen habe ich schon verszanden:
Code:
	private TreeNode getTreeNodeByName(TreeNode node, String nodeName) { 
		//System.out.println("SUCHE: "+nodeName+"  -->  " +  node.toString()+"  "+node.toString().equals(nodeName)); 
		if (node.toString().equals(nodeName)) {
			System.out.println("1. TREFFER! " +node);
			return node; 
		}
		else { 
			for (int i=0; i<node.getChildCount(); i++) {
				TreeNode newNode = this.getTreeNodeByName(node.getChildAt(i), nodeName);
				if (newNode != null) 
					return newNode;					
			}
		} 
		return null;
	}

Nur warum ist die Bedingung in der Schleife bzw. das, was in der Bedingung steht korrekt?
 
S

SlaterB

Gast
hier noch was zum nachdenken ;)

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        rek(1, 4);
    }

    public static boolean rek(int tiefe, int k)
    {
        if (tiefe == k)
        {
            System.out.println("k == tiefe, Treffer in Ebene " + tiefe);
            return true;
        }
        else
        {
            boolean erg = rek(tiefe + 1, k);
            if (erg)
            {
                System.out.println("Treffer-Erwähnungs-Wiederholung in Ebene " + tiefe);
                return true;
            }
            return false;
        }
    }
}

->

k == tiefe, Treffer in Ebene 4
Treffer-Erwähnungs-Wiederholung in Ebene 3
Treffer-Erwähnungs-Wiederholung in Ebene 2
Treffer-Erwähnungs-Wiederholung in Ebene 1
 

Milo

Bekanntes Mitglied
Hallo,

die Wiederholungen kommen vermutlich, weil die Methode noch drei weitere mal aufgerufen wird und alle bis zum Ende abgearbeitet werden. Alle Aufrufe erreichen irgendwann den Status true und enden. Danke fürs Beispiel, klarer ist es trotzdem nicht geworden.

Gruß Micha
 
S

SlaterB

Gast
nochmal: wenn du in Zeile 9 vom rekursiven Aufruf einen Node != null erhälst, dann heißt das doch, dass weiter unten/ hinten/ vorher etwas gefunden wurde,
damit zwangsläufig irgendwann Treffer1 ausgegeben wurde, denn nur Zeile 5 kann einen Node != null zurückgeben,
was ist an diesem Punkt nicht zu verstehen?

falls doch verstanden dann darfst du nun einfach nicht mehr NOCHMAL Treffer ausgeben,
fertig
 

Milo

Bekanntes Mitglied
Hi,

so wie ich es zuletzt gepostet habe, funktioniert es ja nun. Keine Ahnung, ob das nun das optimum ist. Was daran nicht zu verstehen ist, weiß ich leider nicht; ggf. sind Deine Erklärungen für mich nicht so didaktisch und nachvollziehbar, wie es für Dich erscheint - wie gesagt, ich weiß es nicht.

Im Moment habe ich das Gefühl, es wird doppelt das Ergebnis zurückgegeben und nicht nur bei der eigentlichen Prüfung:
Code:
      if (node.toString().equals(nodeName)) { 
         System.out.println("1. TREFFER! " +node); 
         return node; 
      }

Hier erwarte ich das Objekt, was ich auch suche. Letztlich bekommen werde ich aber das, was in der Schleife zurückgegeben wird. Das aus der Schleife stammt nun wiederum aus der Bedingung. Vll muss das ja auch so sein, wer weiß ;-)

Schönen Abend und vielen Danl noch mal
Micha
 

Milo

Bekanntes Mitglied
Hi,

Dein Beispiel würde ich so ändern:

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        rek(1, 4);
    }

    public static boolean rek(int tiefe, int k)
    {
        if (tiefe == k)
        {
            System.out.println("k == tiefe, Treffer in Ebene " + tiefe);
            return true;
        }
        else
            return rek(tiefe + 1, k);
    }
}

Gruß Micha
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Rekursives suchen in einer Liste Java Basics - Anfänger-Themen 8
M Rekursives Programm zum Anzeigen von Primzahlen Java Basics - Anfänger-Themen 3
C Rekursives Backtracking beim Spiel Peg Java Basics - Anfänger-Themen 22
G Rekursives Programmieren --> harmonische Reihe Java Basics - Anfänger-Themen 3
S Rekursives Problem.... Java Basics - Anfänger-Themen 16
S Rekursives Durchlaufen eines Verzeichnisses - AccessDeniedException behandeln Java Basics - Anfänger-Themen 1
S Rekursives Zählen einer Zahl Java Basics - Anfänger-Themen 8
J Rekursives Parsen (ohne Reg Expressions) Java Basics - Anfänger-Themen 8
S Rekursives Umdrehen, Spiegeln. etc. von Strings Java Basics - Anfänger-Themen 3
I Rekursives Löschen in Binärem Suchbaum Java Basics - Anfänger-Themen 2
L rekursives spiel programmieren Java Basics - Anfänger-Themen 4
G Rekursives aufrufen führt zu StackOverflowError Panel durchl Java Basics - Anfänger-Themen 5
G Primzahlentester als rekursives Programm! Java Basics - Anfänger-Themen 13
H Rekursives einlesen von Lokalen Ordner Java Basics - Anfänger-Themen 4
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
I String nach Wort suchen Java Basics - Anfänger-Themen 6
O Namen (mit Umlauten und ß) in einer ArrayList suchen Java Basics - Anfänger-Themen 5
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
CptK Koordinate in Liste suchen Java Basics - Anfänger-Themen 20
Ellachen55 Wie nach häufigste Werte im Array suchen? Java Basics - Anfänger-Themen 2
B Java Mail: suchen von mehreren Emailadressen Java Basics - Anfänger-Themen 5
D Erste Schritte Wert im Array suchen Java Basics - Anfänger-Themen 12
B Suchen und sortieren Java Basics - Anfänger-Themen 10
J Wörter aus Textdatei suchen Java Basics - Anfänger-Themen 2
A Erste Schritte Buchstaben im Array suchen Java Basics - Anfänger-Themen 8
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
S Wort suchen und ersetzen in einer Datei Java Basics - Anfänger-Themen 6
S Amazon Produktbeschreibung auslesen und nach Keywords suchen Java Basics - Anfänger-Themen 2
C In ArrayList suchen Java Basics - Anfänger-Themen 6
G nach 9 - stelliger Nummer suchen Java Basics - Anfänger-Themen 7
D Liste nach 2 gleichen Einträgen suchen Java Basics - Anfänger-Themen 4
N Operatoren Suchen nach einer bestimmten Eingabe (durch Scanner) Java Basics - Anfänger-Themen 7
C char in String suchen und durch anderen String ersetzen Java Basics - Anfänger-Themen 2
Y Explizites Suchen Java Basics - Anfänger-Themen 13
G Zeichen suchen und Ausgeben. Java Basics - Anfänger-Themen 3
K String in String-Array suchen Java Basics - Anfänger-Themen 11
T Suchen in sortiertem Feld Java Basics - Anfänger-Themen 2
K Im String Array suchen Java Basics - Anfänger-Themen 8
E Belebeste Area im Game of Life suchen Java Basics - Anfänger-Themen 0
A Hash Tabelle Element suchen Java Basics - Anfänger-Themen 1
L Name im Array suchen Java Basics - Anfänger-Themen 12
I Innerhalb einer Methode suchen und hinzufügen. Neues Objekt in Suche dann? Java Basics - Anfänger-Themen 8
F Methoden Kontaktliste - String in einem Array suchen und ausgeben Java Basics - Anfänger-Themen 3
A Suchen und ersetzen Java Basics - Anfänger-Themen 13
P Teilstring suchen Java Basics - Anfänger-Themen 3
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
D String in Datei suchen und löschen Java Basics - Anfänger-Themen 2
A Nach dem Objekt suchen Java Basics - Anfänger-Themen 1
F In einem String nach einem String suchen und Zeichen danach ausgeben Java Basics - Anfänger-Themen 6
K Maximum Suchen Array Java Basics - Anfänger-Themen 6
W .txt auslesen und nach schlüsselbegriffen suchen Java Basics - Anfänger-Themen 7
S Suchen in Arrays Java Basics - Anfänger-Themen 7
J Input/Output String Suchen und Ersetzen Java Basics - Anfänger-Themen 8
A Kleinste Ziffer im Array suchen um Sortierung zu erzeugen Java Basics - Anfänger-Themen 2
N Java Programm zum Suchen und Ersetzen von Text Dateien Java Basics - Anfänger-Themen 10
T String in Array suchen Java Basics - Anfänger-Themen 9
G Erste Schritte Nach bestimmten Dateien suchen und dann in die Registry schreiben. Java Basics - Anfänger-Themen 6
B Nach regulären Ausdrücken suchen Java Basics - Anfänger-Themen 14
C Bestimmte Informationen von Webseite suchen Java Basics - Anfänger-Themen 13
B Suchen und ersetzten mit \ ? Java Basics - Anfänger-Themen 9
A String in String suchen Java Basics - Anfänger-Themen 3
J Nach einem Wert suchen +/- x Java Basics - Anfänger-Themen 8
D Binäres Suchen Java Basics - Anfänger-Themen 11
N Weg suchen bei Adjazenzmatrix Java Basics - Anfänger-Themen 2
E Suchen mit Hashfunktion ?! Java Basics - Anfänger-Themen 7
C Binäres Suchen mit Rekursion Java Basics - Anfänger-Themen 5
I Erste Schritte Ein Zeichen in einem Array Suchen Java Basics - Anfänger-Themen 8
N Binär suchen: Java Basics - Anfänger-Themen 4
D In Hashtable suchen Java Basics - Anfänger-Themen 3
J In String suchen Java Basics - Anfänger-Themen 14
D Nach String "{" suchen Java Basics - Anfänger-Themen 4
3 3. Element mit regulären Ausdruck suchen Java Basics - Anfänger-Themen 12
L String suchen und ersetzten, ohne neue Datei Java Basics - Anfänger-Themen 4
M Notiz suchen-Programm Java Basics - Anfänger-Themen 3
F Zusammenhängend Komponente suchen(Graph) Java Basics - Anfänger-Themen 4
M Teilmatrix suchen Java Basics - Anfänger-Themen 16
B Java nach bestimmter dateiendung suchen Java Basics - Anfänger-Themen 6
B Element in Folge suchen Java Basics - Anfänger-Themen 7
T String aus einer ArrayList suchen Java Basics - Anfänger-Themen 7
V Doppelte Zahl suchen Java Basics - Anfänger-Themen 14
G List suchen und doppelte rausfiltern Java Basics - Anfänger-Themen 3
R Datentypen In String nach String suchen und hinzufügen Java Basics - Anfänger-Themen 2
D Textdatei einlesen und darin suchen Java Basics - Anfänger-Themen 11
I Wie kann ich ein Wort in einem String suchen Java Basics - Anfänger-Themen 3
P char[] - suchen/ löschen Java Basics - Anfänger-Themen 6
S Datentypen In ArrayList nach Element suchen und Position ausgeben Java Basics - Anfänger-Themen 9
D Array Fehler / groesste Primzahl suchen Java Basics - Anfänger-Themen 4
C Objekt aus Liste suchen Java Basics - Anfänger-Themen 6
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
D In String suchen und extrahieren Java Basics - Anfänger-Themen 13
B Suchen nach Teilstring, um Text danach ausgeben Java Basics - Anfänger-Themen 11
H Höchsten int-Wert(key) aus einer Hashmap suchen Java Basics - Anfänger-Themen 19
J Feld in Tabelle suchen Java Basics - Anfänger-Themen 8
Developer_X Strings in JTextarea suchen Java Basics - Anfänger-Themen 15
F Datei suchen --> Pfad als String speichern Java Basics - Anfänger-Themen 8
R einen gegebenen String in einem String suchen Java Basics - Anfänger-Themen 6
J Suchen nach ArrayObjekten Java Basics - Anfänger-Themen 17
? Algo gleicher Buchstabe in 2 Wörtern suchen Java Basics - Anfänger-Themen 16
G String suchen Java Basics - Anfänger-Themen 4
X Attribut in n Objekten suchen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben