Alle Dateinamen ermitteln

Schuriko

Bekanntes Mitglied
Wie kann ich am effektivsten aus einem gegebenen Verzeichnis alle Dateinamen ohne Endung ermitteln?

z.B.
c:\temp
name1.txt
name2.txt
name3.txt


ergibt
name1
name2
name3

P.S.
Die Endung ist identisch
 

mihe7

Top Contributor
Zum Beispiel:
Java:
Files.list(Paths.get("."))
    .map(Path::getFileName)
    .map(Path::toString)
    .map(x -> (x.lastIndexOf('.') > 0 ? x.substring(0, x.lastIndexOf('.')) : x))
    .forEach(System.out::println)
 

mihe7

Top Contributor
Java:
Files.list(Paths.get("."))  // Stream aller Pfade im aktuellen Verzeichnis (".") erzeugen
    .map(Path::getFileName)  // von jedem Pfad nur das letzte Element (=Dateiname) betrachten 
    .map(Path::toString) // und zwar als String
    .map(x -> (x.lastIndexOf('.') > 0 ? x.substring(0, x.lastIndexOf('.')) : x)) // die Extension, falls vorhanden, abschneiden
    .forEach(System.out::println)  // und ausgeben
 
Oder so:
Java:
public static void main(String[] args) throws IOException {
	Files.list(Paths.get("."))
	.map(Path::getFileName)
	.map(Path::toString)
	.collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf(".")))
	.entrySet().stream()
	.filter(e -> e.getValue() >= 0)
	.map(e -> e.getKey().substring(e.getValue(), e.getKey().length()))
	.forEach(System.out::println);
}

Du hattest zweimal den lastIndexOf Aufruf und den ternären Operator.
 

LimDul

Top Contributor
Oder so:
Java:
public static void main(String[] args) throws IOException {
	Files.list(Paths.get("."))
	.map(Path::getFileName)
	.map(Path::toString)
	.collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf(".")))
	.entrySet().stream()
	.filter(e -> e.getValue() >= 0)
	.map(e -> e.getKey().substring(e.getValue(), e.getKey().length()))
	.forEach(System.out::println);
}

Du hattest zweimal den lastIndexOf Aufruf und den ternären Operator.
Das finde ich aber schwerer lesbarer - ab der toMap Funktion muss ich genau überlegen, was passiert.
Wenn würde ich eher das map von @mihe7, wo der ternäre Operator und das indexOf vorkommt in eine eigene Funktion auslagen - String removeFileExtension(String fileName). Dann wird er Stream ausdruck zum einen lesbarer, zum anderen aus architektonischer Sicht kann ich die Funktion dann auch separat testen.
 
Nein, den ternären Operator sollte man in Streams vermeiden, er verschlechtert die Lesbarkeit. Was möchtest du denn testen? Ob "e.getValue() >= 0" das richtige Ergebnis zurück gibt?
 

mrBrown

Super-Moderator
Mitarbeiter
Nein, den ternären Operator sollte man in Streams vermeiden, er verschlechtert die Lesbarkeit.
Deshalb sagte er ja auch, den Teil in eine extra Funktion auslagern. Der ternäre Operator ist dem Lambda geschuldet.

Wenn man es auslagert sieht das im Vergleich so aus:

Java:
Files.list(Paths.get("."))
.map(Path::getFileName)
.map(Path::toString)
.map(FileHelper::removeSuffix)



.forEach(System.out::println)
Java:
Files.list(Paths.get("."))
.map(Path::getFileName)
.map(Path::toString)
.collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf(".")))
.entrySet().stream()
.filter(e -> e.getValue() >= 0)
.map(e -> e.getKey().substring(e.getValue(), e.getKey().length()))
.forEach(System.out::println);

Bei letzterem wird jeder mit etwas Erfahrung schreiend im Kreis rennen oder die nächste Brücke suchen.

Was möchtest du denn testen? Ob "e.getValue() >= 0" das richtige Ergebnis zurück gibt?
Ob die Dateiendung korrekt entfernt wird.

Wenn man Testet würde man zB merken, dass dein Code im Gegensatz zu dem von @mihe7 falsch ist.
 

LimDul

Top Contributor
Nein, den ternären Operator sollte man in Streams vermeiden, er verschlechtert die Lesbarkeit. Was möchtest du denn testen? Ob "e.getValue() >= 0" das richtige Ergebnis zurück gibt?
Ob folgendes passiert:

EingabeAusgabe
a.txta
.txt
a.b.c.txta.b.c
a.txt.a.txt
aa

Bei deinem Code passiert davon gar nichts.
a) Dateien ohne Endung werden ausgefiltert und nicht ausgegeben.
b) Du gibts nicht den Teil vor der Endung aus, sondern den Teil ab der Endung

Und genau das meine ich mit schwerer lesbar - ich muss bei deinem substring Audruck zurückdenken, was Key und was Value ist - das ist zwar nicht schwer, aber ist eine notwendige Transferleistung. Das heißt, diese Zeile ist nicht für sich alleine verständlich. Sowas lässt sich zwar nicht immer vermeiden, aber wenn möglich sollte man es man es versuchen zu vermeiden. Denn wie man schön an diesem Beispiel sieht, schleichen sich da schnell Fehler ein.
 
Der . gehört mit zur Dateiendung.

dass dein Code im Gegensatz zu dem von @mihe7 falsch ist
Wie bist du denn drauf?

Wenn der vordere Teil gewünscht ist, dann eben so, aber so viel Transferleistung hätte ich von jedem erwartet:
Java:
public static void main(String[] args) throws IOException {
	Files.list(Paths.get("."))
	.map(Path::getFileName)
	.map(Path::toString)
	.collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf(".")))
	.entrySet().stream()
	.filter(e -> e.getValue() > 0) // write >= 0, if you want empty Strings
	.map(e -> e.getKey().substring(0, e.getValue()))
	.forEach(System.out::println);
}
 
Zuletzt bearbeitet:

LimDul

Top Contributor
Der . gehört mit zur Dateiendung.


Wie bist du denn drauf?
Weil es im ersten Post steht

Wenn der vordere Teil gewünscht ist, dann eben so, aber so viel Transferleistung hätte ich von jedem erwartet:
Java:
public static void main(String[] args) throws IOException {
	Files.list(Paths.get("."))
	.map(Path::getFileName)
	.map(Path::toString)
	.collect(Collectors.toMap(Function.identity(), t -> t.lastIndexOf(".")))
	.entrySet().stream()
	.filter(e -> e.getValue() > 0) // write >= 0, if you want empty Strings
	.map(e -> e.getKey().substring(0, e.getValue()))
	.forEach(System.out::println);
}
Immer noch falsch, weil Dateien ohne Endung weiterhin ausgefiltert werden.
 
K

kneitzel

Gast
Ach je, wieder einmal
a) wurden die Anforderungen falsch beschrieben und
b) alle bis auf einen haben keine Ahnung.

Und natürlich ist es für ein Genie sehr schwer zu erfassen, was weniger geniale Menschen noch als lesbar empfinden....

Also kann nicht mal ein Mod hier eingreifen und zum einen die Frage des TEs editieren so dass der einzig wahre Code passt und zum anderen die absolut lachhafte Kritik sowie die schlechten Lösungsversuche der Anderen löschen? Das kürzt das alles, was noch kommt, direkt ab.

*SCNR*

Und ja, bei mir gab es heute Mittag Clown - daher bitte nicht böse mit mir sein. Danach bin ich halt so :)
 
Weil es im ersten Post steht
In der Aufgabe steht nirgendwo, was mit "foo.", ".bar" und "baz" passieren soll, von daher lässt sich gar nicht sagen das sei falsch...
Wenn Dateien ohne Endung berücksichtigt werden sollen...
Java:
public static void main(String[] args) throws IOException {
	Map<Boolean, List<String>> groups = Files.list(Paths.get(".")).map(Path::getFileName).map(Path::toString)
			.collect(Collectors.groupingBy(s -> s.contains(".")));
	groups.get(true).stream().map(s -> s.substring(0, s.lastIndexOf("."))).forEach(System.out::println);
	groups.get(false).stream().forEach(System.out::println);
}

Eine Fallunterscheidung in Streams ist immer hässlich... Insofern ist "GrünerPlanet" zuzustimmen. :)
 
K

kneitzel

Gast
Also den ternären Operator selbst finde ich auch unschön - da ist die Methode wie in #8 zu sehen - eine sehr schöne Lösung.

Die Alternative aus #5 ist aber extrem unleserlich. Selbst die Lösung aus #17 sehe ich als suboptimal an.

Wieso muss man so viel in streams machen? Meine Lösung wäre da sogar gewesen:
Code:
Files.list(Paths.get("."))
    .map(FileHelper::getFileNameWithoutSuffix)
    .forEach(System.out::println);
 

mrBrown

Super-Moderator
Mitarbeiter
In der Aufgabe steht nirgendwo, was mit "foo.", ".bar" und "baz" passieren soll, von daher lässt sich gar nicht sagen das sei falsch...
Es lässt sich völlig eindeutig sagen, dass der Code falsch war. Nur die Endung zurückgeben ist einfach das völlige Gegenteil von "Dateinamen ohne Endung".

Man kann natürlich über "foo.", ".bar" und "baz" streiten. Allerdings ist die Annahme, dass ein Dateiname ohne Endung bereits ein Dateiname ohne Endung ist, deutlich sinnvoller als die Annahme, dass Dateinamen ohne Endung wegzuwerfen sind. Okhams Razor, Principle of Least Surprise, etc...

Eine Fallunterscheidung in Streams ist immer hässlich... Insofern ist "GrünerPlanet" zuzustimmen. :)
Allerdings ist kaum etwas hässlicher als eine Map für sowas zu missbrauchen, nicht mal Fallunterscheidung in Streams.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Alle Files im Ordner nach Dateinamen durchsuchen Allgemeine Java-Themen 28
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
_user_q Alle Kombinationen von "0000" bis "FFFF" kompakt schrieben Allgemeine Java-Themen 13
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
L Farbverlauf RGB alle Farben Allgemeine Java-Themen 28
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
MaxG. Best Practice Alle Kombinationen berechnen Allgemeine Java-Themen 3
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
S Anwendung die alle Abhaengigkeiten einer Library listet..? Allgemeine Java-Themen 5
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
I Alle logs von Logger bekommen Allgemeine Java-Themen 3
U javax.mail.Folder.list() zeigt nicht alle Ordner Allgemeine Java-Themen 5
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
L Alle möglichen Additionen (Rekursiv) Allgemeine Java-Themen 3
KaffeeFan Methoden replace alle Buchstaben Allgemeine Java-Themen 3
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
F Java Spintax: Alle Kombinationen Erzeugen Allgemeine Java-Themen 2
Sogomn Klassen Alle in eine Klasse Allgemeine Java-Themen 11
P Methoden Alle Kombinationen aus 2 Karten berechnen Allgemeine Java-Themen 2
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
M Zufälligen String generieren und alle 5 Minuten ändern Allgemeine Java-Themen 2
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
C SwingWorker.cancle(true) tötet alle Worker Allgemeine Java-Themen 3
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
T Alle Instancen einer Klasse auflisten Allgemeine Java-Themen 13
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
S Alle Kombinationen aus ArrayList - Potenzmenge Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
brunothg Alle Kombiationen von n Ziffern Allgemeine Java-Themen 2
M Erste Schritte alle xmlFiles in zugehörige pdfFiles einlesen Allgemeine Java-Themen 4
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
E Logger loggt nicht alle Level Allgemeine Java-Themen 2
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
K String: alle X Zeichen Zeilenumbruch Allgemeine Java-Themen 3
F Alle Exceptions abfangen Allgemeine Java-Themen 4
nrg JS als ScriptEngine - alle Punkte ersetzen Allgemeine Java-Themen 4
A Bildschirmauflösung geändert - alle Bildschirminhalte verschoben - was tun? Allgemeine Java-Themen 7
C Alle Klassen eines Packages lesen und instanzieren? Allgemeine Java-Themen 9
B Alle Exceptions auf einmal abfangen Allgemeine Java-Themen 4
S Warum packt er nicht alle Dateien? Allgemeine Java-Themen 13
J Alle Tage eines Jahres Allgemeine Java-Themen 2
AlexSpritze Alle Domains oder FQDN von einem Server erfragen? Allgemeine Java-Themen 2
Spot84 alle kombinationen einer string arraylist Allgemeine Java-Themen 2
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
J Konstrukt um alle Paare und Tripel einer Punkte-Menge bilden Allgemeine Java-Themen 12
B Alle möglichen Buchstabenkombinationen in einem String Allgemeine Java-Themen 7
P alle zusammanhaengenden teilgraphen Allgemeine Java-Themen 7
A alle nicht-dplikate finden Allgemeine Java-Themen 14
M Wie kann ich alle System.out Strings in ein log window umleiten? Allgemeine Java-Themen 6
E Alle unter Prozesse der beim schließen mit schließen Allgemeine Java-Themen 3
A An alle Cracks: Anwendung beenden mit ShutdownHook? Allgemeine Java-Themen 13
J Logger gibt nicht alle Level aus Allgemeine Java-Themen 3
M alle möglichen Zahlenkombinationen Allgemeine Java-Themen 5
B in welchem verzeichnis liegen alle installierten klassen? Allgemeine Java-Themen 6
hdi Für alle fleissigen Helfer! Allgemeine Java-Themen 15
N Alle Fehler ausgeben? Allgemeine Java-Themen 4
J Zweiter Prozess der alle x Sekunden etwas abfragen soll Allgemeine Java-Themen 2
O Auf alle Events reagieren Allgemeine Java-Themen 3
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
U alle Dateien eines Ordners innerhalb einer JAR auflisten Allgemeine Java-Themen 6
S toString() für alle Member einer Klasse. Allgemeine Java-Themen 6
G Alle möglichen Konfigurationen eines Baumes Allgemeine Java-Themen 4
C Alle Möglichen Substrings der Länge k aus String extrahieren Allgemeine Java-Themen 9
C Alle Bilder eines binären Arrays ausgeben Allgemeine Java-Themen 3
G Alle möglichen Permutationen einer Folge n Allgemeine Java-Themen 3
V Alle Klassen eines Package auflisten? Allgemeine Java-Themen 6
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
@ RegEx: Alle Sonderzeichen ausser dem Punkt Allgemeine Java-Themen 4
G Alle Möglichen Kombinationen einer Liste Allgemeine Java-Themen 11
H Alle möglichen Hochkommata ausschließen Allgemeine Java-Themen 6
M Gibt es ein Jar - das alle Componente Automatisch anpasst? Allgemeine Java-Themen 14
K Suche alle Objekte einer bestimmten Klasse Allgemeine Java-Themen 2
N Unter Mac Os X alle laufenden Prozesse ausgeben Allgemeine Java-Themen 3
S Änderung an Proberties datei an alle User weitergeben? Allgemeine Java-Themen 7
P Observer, nicht alle updates bearbeiten Allgemeine Java-Themen 2
der JoJo [TreeSelection] wie bekomme ich alle Elemente Allgemeine Java-Themen 4
G Alle Zeichen des Alphabets ausgeben Allgemeine Java-Themen 4
G Alle Möglichkeiten n Elemente Anzuordnen. Allgemeine Java-Themen 13
0 Alle Teiler einer Zahl performant berechnen? Allgemeine Java-Themen 9
J Funktion alle Möglichkeiten berücksichtigen Allgemeine Java-Themen 5
O Warten bis alle gestarteten Threads beendet sind? Allgemeine Java-Themen 6
G HTML file Alle relativen URL in absolute URL umschreiben? Allgemeine Java-Themen 12

Ähnliche Java Themen


Oben