Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

File[] nach Namen sortieren

10 views
Skip to first unread message

Titus Kruse

unread,
Oct 16, 2001, 3:15:53 PM10/16/01
to
Hallo.

Sicher für euch ein alter Hut: Wie kann ich eine durch listFiles()
zurückgegebenes Array von File nach Namen sortieren. Eventuell sogar mit den
Verzeichnissen vor den Dateien in der Liste. Geht das irgendwie elegant oder
muß ich erst alle Namen per Schleife in einen TreeSet kopieren?

Titus.

Marco Schmidt

unread,
Oct 16, 2001, 3:40:38 PM10/16/01
to
"Titus Kruse" <mar...@tecs.de> wrote:

>Sicher für euch ein alter Hut: Wie kann ich eine durch listFiles()
>zurückgegebenes Array von File nach Namen sortieren. Eventuell sogar mit den
>Verzeichnissen vor den Dateien in der Liste.

Du könntest einen entsprechenden Comparator bauen, der zunächst nach
dem Ergebnis von isDirectory() und sekundär nach getName() sortiert.

Gruß,
Marco
--
Bitte nur in der Newsgroup antworten, nicht per Email!
Homepage und FAQ von de.comp.lang.java: http://www.dclj.de/
Tips und Links zu Java: http://jiu.sourceforge.net/javatips.html
Open Directory: http://dmoz.org/Computers/Programming/Languages/Java/

Lars Amsel

unread,
Oct 16, 2001, 3:55:38 PM10/16/01
to
Titus Kruse schrieb:

Ganz einfach. Du schreibst Dir einen Comparator, der zwei Dateien
vergleicht.

public FileComparator implements Comparator {
public int compare(Object o1, Object o2) {
if ((o1 instanceof File) && (o2 instanceof File)) {
String name1 = ((File)o1).getName();
String name2 = ((File)o2).getName();
return name1.compareTo(name2);
}
return 0;
}
}

Dann kannst Du mit

Array.sort(myArray, new FileComparator());

das Array sortieren. Du koenntest dann noch abhängig vom BS mit compareTo()
bzw. compareToIgnoreCase() vergleichen. Du kannst auch statt getName()
getAbsolutePath() verwenden.

Gruß

Lars
>
>
>
>

Lukas Schaefer

unread,
Oct 16, 2001, 4:38:30 PM10/16/01
to
On Tue, 16 Oct 2001 21:15:53 +0200, "Titus Kruse" <mar...@tecs.de>
wrote:

>Hallo.
>
>Sicher für euch ein alter Hut: Wie kann ich eine durch listFiles()

muß es unbedingt ein Array aus Files sein ? die Namen gibts auch als
String-Array, aber das nur am Rande.


>zurückgegebenes Array von File nach Namen sortieren. Eventuell sogar mit den
>Verzeichnissen vor den Dateien in der Liste. Geht das irgendwie elegant oder
>muß ich erst alle Namen per Schleife in einen TreeSet kopieren?

nein, das miußt Du nicht.
File implementiert das Comparable Interface !
es könnte also durchaus mit java.util.Arrays#sort(Object[])
funktionieren, wenn nicht, kannst Du immer noch aus deinem File-Array
eine List machen (java.util.Arrays#asList(Object[]) und damit dein
TreeSet füttern
hth Lukas

Lars Amsel

unread,
Oct 16, 2001, 5:41:02 PM10/16/01
to
Niko Schwarz schrieb:

> Lars Amsel wrote:
>
> grüß dich, alter =)

N'Abend

> krieg ich noch nen abschließenden tip zu meinem ejb-ding? =)

Muss ich nochmal in den Thread sehen...

>
>> public FileComparator implements Comparator {
>> public int compare(Object o1, Object o2) {
>> if ((o1 instanceof File) && (o2 instanceof File)) {
>

> darf ich dir einen tip geben? ein comparator darf mit ClassCastExceptions
> schmeißen, die tests sind also überflüssig.

Ah, ja. Und die Sortierung läuft trotzdem durch? Wie werden denn die beiden
Argumente angeordnet, wenn ich diese Exception werfe?

>
>> String name1 = ((File)o1).getName();
>
> nächster tip: File kann die dateinamen auch gleich als string rausrücken,
> in diesem fall sicherlich praktischer.

Und was macht getName() ?

>
> ist nicht bös gemeint, bitte nicht haun!

* Den Gürtel raushol... *

Gruß

Lars

Raffael Herzog

unread,
Oct 16, 2001, 6:57:19 PM10/16/01
to
Niko Schwarz scrieb:

> Niko Schwarz wrote:
>
> damit müsste folgender code funken:
>
> [Code]

Darf ich mal enhancen?

,----[ Code ]
|
| import java.io.File;
| import java.util.Arrays;
|
| public final class FileSorter {
|
| public static void main(final String args[]) {
| final File file = new File(System.getProperty("user.home"));
| final File[] list = file.listFiles();
| Arrays.sort(list);
| for ( i=0; i<list.length; i++ ) {
| System.out.println(list[i]);
| }
| }
|
| }
`----

,----[ API-Docs für Arrays.sort(Object[] a) ]
|
| Sorts the specified array of objects into ascending order, according
| to the natural ordering of its elements. All elements in the array
| must implement the Comparable interface. [...]
`----

File implementiert Comparable, man muss also keinen Comparator
angeben.

,----[ API-Docs für File#compareTo() ]
|
| Compares two abstract pathnames lexicographically. The ordering
| defined by this method depends upon the underlying system. On UNIX
| systems, alphabetic case is significant in comparing pathnames; on
| Win32 systems it is not.
`----

Noch besser, jeder kriegt das, was er sich von seinem System gewohnt
ist.

Nun noch die Verzeichnisse zuerst:

,----[ Code ]
|
| Arrays.sort(list, new Comparator() {
| public int compareTo(final Object o1,
| final Object o2)
| {
| final File f1 = (File)o1;
| final File f2 = (File)o2;
| if ( f1.isDirectory() == f2.isDirectory() ) {
| return f1.compareTo(f2);
| }
| else if ( f1.isDirectory() ) {
| return 1;
| }
| else {
| return -1;
| }
| }
| });
`----


Gruss,

Raffi


--
(o_ Raffael Herzog
//\ her...@raffael.ch
V_/_ http://www.raffael.ch
May the penguin be with you!

Lars Amsel

unread,
Oct 17, 2001, 2:40:16 AM10/17/01
to
Morgen Niko,

Niko Schwarz schrieb:


>> Ah, ja. Und die Sortierung läuft trotzdem durch? Wie werden denn die
>> beiden Argumente angeordnet, wenn ich diese Exception werfe?
>

> vermutlich gar nicht, sondern es kommt eben zu einer exception, was ich in
> dem fall aber auch für angebracht halte. wie auch immer: im interface
> steht dick und breit, dass du diese exception werfen darfst. ob und wie
> die behandelt wird, war sache des autors der Collections klasse.

Hm, das is ja doof. Ich könnte mir z.B. eine Lösung vorstellen, bei der
alle Einträge, die null sind am Ende der Liste landen, oder so. Naja, mal
probieren, wie er sich verhält.

>> Und was macht getName() ?
>

> ich meinte eigentlich schon beim list()

Im subject steht aber: *File[]* nach Namen sortieren

>
>>> ist nicht bös gemeint, bitte nicht haun!
>>
>> * Den Gürtel raushol... *
>

> <prophylaktisch>
> auauau!
> </prophylaktisch>

Naja, sicher is, ne?

Gruß

Lars

Titus Kruse

unread,
Oct 17, 2001, 3:02:14 PM10/17/01
to

Lars Amsel <la...@merula.de> schrieb in im Newsbeitrag:
rb3iq9...@merula.de...

> > Sicher für euch ein alter Hut: Wie kann ich eine durch listFiles()
> > zurückgegebenes Array von File nach Namen sortieren. Eventuell sogar mit
> > den Verzeichnissen vor den Dateien in der Liste. Geht das irgendwie
> > elegant oder muß ich erst alle Namen per Schleife in einen TreeSet
> > kopieren?
>
> Ganz einfach. Du schreibst Dir einen Comparator, der zwei Dateien
> vergleicht.
> Dann kannst Du mit
>
> Array.sort(myArray, new FileComparator());
>

Vielen Dank. Das ist genau das, was ich gesucht hatte. In meinem Programm
lese ich eine Verzeichnisstruktur rekursiv aus. Ein durch File.list()
erstelltes Array von Dateinamen wäre zwar einfacher zu sortien gewesen.
Allerdings hätte ich dort (meines Wissens nach) keine Verzeichnisse
unterscheiden können.

Titus.

Titus Kruse

unread,
Oct 17, 2001, 3:11:58 PM10/17/01
to

Lukas Schaefer <lu...@rz-online.de> schrieb in im Newsbeitrag:
3bcc9570...@news.rhein-zeitung.de...

> funktionieren, wenn nicht, kannst Du immer noch aus deinem File-Array
> eine List machen (java.util.Arrays#asList(Object[]) und damit dein
> TreeSet füttern


Auch ein interessanter Tip. Ich habe mich jedoch für die erste Variante,
also dem Schreiben einer Comparator-Klasse entschieden. Danke nochmal an
Alle.

Titus.

Lars Amsel

unread,
Oct 17, 2001, 3:43:11 PM10/17/01
to
Titus Kruse schrieb:

> Vielen Dank. Das ist genau das, was ich gesucht hatte. In meinem Programm
> lese ich eine Verzeichnisstruktur rekursiv aus. Ein durch File.list()
> erstelltes Array von Dateinamen wäre zwar einfacher zu sortien gewesen.
> Allerdings hätte ich dort (meines Wissens nach) keine Verzeichnisse
> unterscheiden können.

Hm. Das sollte doch kein Problem sein. Du hast doch das Fileobjekt, auf dem
Du das list() ausführst. Und damit kommst Du auch an den Namen des
Verzeichnisses.

Gruß

Lars

Raffael Herzog

unread,
Oct 17, 2001, 5:54:40 PM10/17/01
to
Niko Schwarz scrieb:

> Raffael Herzog wrote:
>
> >> [Code]
> >
> > Darf ich mal enhancen?
>

> piiiirompo.

Häh?


> es wird immer besser =)

Mir ist das alles auch furchtbar neu, ich wollte nur mal wieder
aufzeigen: Man lese die API-Docs, es sind viele Schätze darin
versteckt! Eigentlich bin ich nur darüber gestolpert, dass Du für das
Vergleichen von Strings extra einen Comparator geschrieben hast, ich
dachte mir: "Das kann doch nicht sein!"... :-) Naja, wer beschäftigt
sich heute noch mit so trivialen Problemen -- wie war noch mal das
Wort dafür? Fachidiot? *eg*

0 new messages