FileTreeWalker

sh33p

Bekanntes Mitglied
moin,

ich hab mal wieder eine Aufgabe bekommen, die gar nicht zur Thematik passt ^^.
Es sollen verschiedene Modifzierungen durchgeführt werden. Das ist erstmal egal.
Ich versteh überhaupt nicht,was diese Klasse macht.Kann mir mal jemand grob sagen,was
hier vorgeht?
Folgende Klasse ist gegeben

Java:
import java.io.*;

      class FTWalker {

        public static void main(String[] args) throws IOException {
          new FTWalker().walk(args[0]);

        }

        void walk(String pathname) throws IOException {
          File[] files = new File(pathname).listFiles();

          if (files != null)
            for (File file: files)
              if (file.isDirectory())
                walk(file.getCanonicalPath());
              else
                process(file.getCanonicalPath(), (int)file.length());
        }

        void process(String name, int length) {
          System.out.printf("%-70s%9d%n", name, length);
        }

      }
 

eRaaaa

Top Contributor
Wenn`s dir wirklich nur darum geht zu wissen was diese Klasse macht, könnte man das Ganze ja mal laufen lassen und selbst schauen oder?

Der Methode
Code:
walk
wird ein
Code:
String
übergeben, welcher normalerweise ein Pfad zu einem Verzeichnis darstellen soll.
Code:
listFiles()
liefert ein Array mit allen Dateien und Verzeichnisse innerhalb diesem Verzeichnis auf oder
Code:
null
wenn der
Code:
String
kein Verzeichnis war oder der Pfad nicht existiert. Genauere Infos hier: File (Java Platform SE 6)

Anschließend wird das Array durchlaufen und geguckt ob es sich um ein Verzeichnis handelt, dann wird die Method erneut aufgerufen aber mit diesem Verzeichnis (rekursiv), ansonsten wird die Methode
Code:
process
aufgerufen mit dem Pfad + Länge und diese wiederum dann dort ausgeben
 

sh33p

Bekanntes Mitglied
jop das hab ich auch schon rausgefunden.. :applaus:

ich möchte nun die Dateien nach fallender länge ausgeben..dabei kann ich Arrays.sort verwenden oder?nach vorherigen überschreiben von equals..

Java:
void walk(String pathname) throws IOException {

            File[] files = new File(pathname).listFiles();
          if (files != null)
            for (File file: files)
              if (file.isDirectory())
                walk(file.getCanonicalPath());
              else {
                Arrays.sort(files);
                process(file.getCanonicalPath(), (int)file.length());

              }

        }

        void process(String name, int length) {
          System.out.printf("%-70s%9d%n", name, length);
        }
        
        public boolean equals(Object o){
          if(o == null){
            return false;
          }
          if( o == this){
            return true;
          }
          //....
        }

nur ich kann ja nicht in equals auf die länge von files zugreifen
 

sh33p

Bekanntes Mitglied
jop das hab ich auch schon rausgefunden.. :applaus:

ich möchte nun die Dateien nach fallender länge ausgeben..dabei kann ich Arrays.sort verwenden oder?nach vorherigen überschreiben von equals..

Java:
void walk(String pathname) throws IOException {

            File[] files = new File(pathname).listFiles();
          if (files != null)
            for (File file: files)
              if (file.isDirectory())
                walk(file.getCanonicalPath());
              else {
                Arrays.sort(files);
                process(file.getCanonicalPath(), (int)file.length());

              }

        }

        void process(String name, int length) {
          System.out.printf("%-70s%9d%n", name, length);
        }
        
        public boolean equals(Object o){
          if(o == null){
            return false;
          }
          if( o == this){
            return true;
          }
          //....
        }

nur ich kann ja nicht in equals auf die länge von files zugreifen

Edit: Ah ne ich brauch ja nen Comparator :D
 

eRaaaa

Top Contributor
Edit: Ah ne ich brauch ja nen Comparator :D
Joah und wo ist das Problem jetzt?
Java:
Arrays.sort(files, new Comparator<File>() {
			@Override
			public int compare(File o1, File o2) {
				//todo
			}
		});

Ich würde den Aufruf allerdings an anderer Stelle machen oder? ;)

Achja und "jop das hab ich auch schon rausgefunden.." - hättest du uns ruhig mitteilen können, dann hätte man sich das Ganze sparen können....
 
Zuletzt bearbeitet:

sh33p

Bekanntes Mitglied
hab noch ne Frage...

Java:
import java.util.*;
import java.io.*;
public class NamenComparator implements Comparator<File> {

public int compare(File f1, File f2){


  if(f1.getName() == f2.getName()){
    System.out.println(f1.getName() + " und " + f2.getName() + " sind gleich");
  }


  return f1.getName().compare(f2.getName());
}
}

ich weiß, das ich einen String zurück gebe..es muss aber ein int sein..wie kann ich das erreichen?habs versucht zu casten..
 

eRaaaa

Top Contributor
aber es müsste doch auch mit einem Comparator gehen?!:rtfm:

Ja da waren wir uns doch schon einig?!
Ich rede aber von der Zeile:
Code:
 return f1.getName().compare(f2.getName());

compare != compareTo !!!

Am besten du liest dich noch einmal in Comparable und Comparator ein!
 
Zuletzt bearbeitet:
E

edyoooo

Gast
Hilft dir das weiter?

Code:
static void sortAsc(List<Integer> a) {
		int[] erg = new int[a.size()];
		Collections.sort(a);
		Comparator<Integer> comparator = Collections.reverseOrder();
		Collections.sort(a, comparator);
		for (int i = 0; i < a.size(); i++) {
			erg[i] = a.get(i);
		}
		System.out.println("\nAsc: "+ Arrays.toString(erg));
	}
 

Neue Themen


Oben