Rekursive Baumdarstellung


#1
Guten Morgen Zusammen!

Ich habe folgendes Problem:
Der Inhalt eines Verzeichnisses soll in einer Baumform in der Konsole ausgegeben werden. Dazu habe ich folgende Methode, welche den Verzeichnisbaum vom übergebenen File-Objekt rekursiv durchläuft:

Code:
private void execute(File dir) {
		File[] files = dir.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				System.out.print("| ");
				if (files[i].isDirectory()) {
					System.out.println("./" + files[i].getName() + "(Folder)");
					execute(files[i]);
					}
				else {
					System.out.println("| ./" + files[i].getName() + "(File)");
				}
			}
		}
	}
Das Traversieren durch die Verzeichnisse funktioniert auch wunderbar, allerdings gibt es nicht die erhoffte Ausgabe, wie etwa

Code:
| ./test
| | ./test/01
| | | ./test/01/1.txt
| | | ./test/01/2.txt
| | | ./test/01/3.txt
| | ./test/02
| | | ./test/02/1.txt
| | ./test/03
| | | ./test/03/1.txt
| | | ./test/03/2.txt
| ./test01
| ./test02
Weiß jemand, was ich für die korrekte Baumdarstellung tun muß? Stehe da gerade ziemlich auf dem Schlauch und sehe den Wald vor lauter Baumen nicht mehr..:rolleyes:

Vielen Dank im Voraus und Grüße!
 
#2
Das Problem ist das du in deinem for()-Loop immer wieder am Anfang der Zeile beginnts. Was du also brauchst ist ein zusätzlicher Parameter der die Verzeichnistiefe angibt ... und mit Hilfe dessen du in einem weiteren for()-loop die | schreibst und dann erst den Verzeichnis- oder Dateinamen. Einfach am Anfang eines rekursiven Aufrufs EINMAL das gewünschte zu schreiben reicht nicht. Du musst es jedes mal ausgeben ... und natürlich auch entsprechend oft. Da hilft nur ein Counter ...
 
#3
Vielen Dank erstmal dafür!
Daran habe ich auch gedacht,aber wie implementiere ich den in diesem Fall? Der Counter würde sich doch nach jedem rekursiven Aufruf wieder neu initialisieren, oder irre ich mich****
 

wakoz

Erfahrenes Mitglied
#4
Eigentlich kein Counter sondern ein Parameter der die ebene angibt.

Beim ersten Aufruf der Methode wird 1 übergeben oder kein wert. (kein wert = 1 )

und bei jeden schritt tiefer in den Baum wird der übergebene Parameter mit wert+1 übergeben.

Dann musst du nur noch für den Parameterwert x mal dein | schreiben und schon hast du das so wie du möchtest.

vielleicht mit einer überladenen Methode ;)

Code:
private void execute(File dir){
        execute(dir, 1);
}

private void execute(File dir, int wert){
        File[] files = dir.listFiles();
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                System.out.print("| ");//<-- Schleife einfügen ;)
                if (files[i].isDirectory()) {
                    System.out.println("./" + files[i].getName() + "(Folder)");
                    execute(files[i], wert +1);
                    }
                else {
                    System.out.println("| ./" + files[i].getName() + "(File)");
                }
            }
        }
}
 
#5
Code:
public void execute(File dir, int index) {
		File[] files = dir.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				for(int j = 0; j <= index; j++) {
					System.out.print("| ");
				}
				if (files[i].isDirectory()) {
					System.out.println("./" + files[i].getName() + "(Folder)");
					execute(files[i], index+1);
				}
				else {
					System.out.println("| ./" + files[i].getName() + "(File)");
				}
			}
		}
	}
Funktioniert aber immer noch nicht wie erhoft..Was mache ich falsch?
 
Zuletzt bearbeitet von einem Moderator: