# Rekursive Methode will nicht so wie ich will ;)



## RagnarZero (2. Jul 2007)

Hallo allerseits!
Ich bin mal wieder (wie so oft) an einer Stelle, wo alles einfach nich das tut, was ich will. Nur diesmal finde ich den Fehler einfach nicht, denn meiner Meinung nach müsste das Teil nach allen Regeln der Logik so laufen.
Was ich machen will, ist mithilfe des JTree Objekts aus Dateien einen Baum erstellen. Klingt erstmal leicht, nur ich möchte diesen aus selbst kreierten Dateien heraus erstellen lassen.
Das ist, wenns fertig wird für einen MP3-Player und der Baum wird ein Genre-Baum.
Eine Datei ist Typischerweise so ausgebaut:

```
[Parent-Genre]
[Sub-Genre]
```

Also als Parent zB Rock und dann als Child Punkrock, oder so 
Meine Klasse zum erstellen dieser Files funktioniert eigentlich wunderbar, da liegt das Problem nicht.
Nun hab ich mir nämlich gedacht ich bau erstmal eine Schleife, die die Obergenres (zB Rock) herausfindet und die wiederrum eine Methode aufruft, die rekursiv ist und die Subgenres und deren Subgenres herausfindet.

Das ist meine Parent-herausfinde-schleife:

```
for(int i = 0; i<genres.length;i++){
            //genres ist hier das array mit den ganzen genredateipfaden, die zuvor gefunden wurden.
            if(GF.checkRoot(genrePath,genres[i])==true){
                    //checkRoot schaut, ob das gerade untersuchte Genre ein Obergenre ist
                    createTree(genres[i],top);
                    
            }            
        }
```

Auch das funktionier soweit, doch jetzt kommt der haken:


```
private void createTree(String genreName, DefaultMutableTreeNode rootGenre){
                //genreName.length() -6 ist hierbei der Name des gefundenen Subgenres
                subGenre = new DefaultMutableTreeNode(genreName.substring(0,genreName.length() -6));
                //Das rootGenre ist beim ersten Mal top, also die spitze des Trees 
                rootGenre.add(subGenre);
                //RootGenres suchen
                for(int k=0; k<genres.length;k++){
                   
                    if(GF.checkRoot(genrePath,genres[k])==false &&  GF.readGenreParent(genrePath,genres[k]).equals(subGenre.toString()) ){
                         //Dieses IF trifft ein, wenn er zu dem Gefundenen Genre ein weiteres Subgenre gefunden hat..
                         //..und führt daraufhin die Methode nochmal mit diesem aus, solange bis es nix mehr gibt
                         createTree(genres[k],subGenre);
                    }
                }
     }
```

Das Problem hierbei ist, dass er nur einen Zweig des Trees durchgeht, also er findet ein Subgenre und dessen Subgenre und soweiter aber er findet immer nur eins, auch wenn es mehrere gibt.
Ich dachte bisher immer, wenn er die Methode ausgeführt hat, kehrt er zu dem Punkt, an dem sie aufgerufen wird zurück, also er würde dann in dem Falle oben wieder an die Stelle in der for-Schleife springen, wo er aufgehört hat. Aber anscheinend wird die for-schleife bei einem Fund sofort für beendet erklärt und daher findet er immer nur ein Subgenre.
Falls irgendjemand eine Idee hat, was ich falsch gemacht hab oder wenn es so nicht funktioniert, was ich sonst machen könnte wäre ich sehr dankbar, ich bin nämlich langsam am verzweifeln


----------



## SlaterB (2. Jul 2007)

nicht so wirr bitte, 
da sind zwei for-Schleifen, welche meinst du denn nun,

helfen dir Ausgaben a la

```
System.out.println("vor k-Schleife, genres.length: "+genres.length);
for(int k=0; k<genres.length;k++){
     System.out.println("in k-Schleife, k: "+k);                   
}
System.out.println("nach k-Schleife");
```
?



und falls dich das Programm mit Augaben überschüttet:
schön klein anfangen, erstmal nur ein Genre und 2 Subgenre oder 2+3 oder wie auch immer,
weiß gar nicht worum es geht


----------



## RagnarZero (2. Jul 2007)

Sorry, ist irgendwie auch alles ein bisschen wirr 
Also der Fehler ist in der zweiten for-schleife, die die Methode rekursiv wieder aufrufen soll. Er sucht zwar richtigerweise subgenres zu einem rootgenre zusammen, aber eben nur einen ast, vom JTree, obwohl er doch logischerweise alles finden müsste (?).
Solche System.out.println, hatte ich auch schon Mengenweise drinne, die haben mir aber auch nur gezeigt, was ich schon weiß, nämlich, dass nach einem subgenre fund (in der createTree methode) die for-schleife, aus der das Teil aufgerufen wird, beendet wird, obwohl sie doch eigentlich noch zuende laufen müsste?


----------



## SlaterB (2. Jul 2007)

mache notfalls am Anfang und am Ende des Schleifenkörpers eine Ausgabe von k und auch von genres.length,
wenn die letzte Zeile k=0 ergibt und die Länge > 1 ist,
dann wird die Schleife weiter abgearbeitet, so ist das nunmal im Leben 

baue dir notfalls eine while-Schleife

```
while(true) {
  k++;
  if (k>=genres.length) {
    break;
  }
  ...
}
```
wenn du der for-Schleife nicht vertraust, da kannst du nun genau vor dem if eine Ausgabe machen,
wenn du auch dann behauptest, dass bei k=1 und genres.length > 1 
die Schleife abgebrochen wird, ja dann kann man wirklich nix mehr dazu sagen 

ein vollständig laufendes Programm wäre übrigens hilfreich..,


----------

