Was ich tun möchte, ist, wenn ich eine Liste von Zeichenfolgen `" Einfügen "," Erstellen "," Löschen "`
habe, ich möchte sie in der Reihenfolge sortieren, die ich mag, nicht in der natürlichen Reihenfolge. Insbesondere möchte ich in der Reihenfolge `" drop "," create "," insert "`
sortieren.
In diesem Fall ist es in SQL ausreichend, mit der charakteristischen Funktion nach `` `case``` zu sortieren, da die Elemente der Menge begrenzt sind. Ich möchte dasselbe mit Java machen.
java 1.8
Es hat ein charakteristisches Funktionsäquivalent in `` `Map```. Schlüssel ist ein Element der Menge und Wert ist eine Ganzzahl in der Sortierreihenfolge.
Map<String, Integer> map = new HashMap<>();
map.put("drop", 1);
map.put("create", 2);
map.put("insert", 3);
List<String> list = Arrays.asList("insert", "create", "drop");
list.stream()
.sorted((s1, s2) -> map.get(s1).compareTo(map.get(s2)))
.forEach(System.out::println);
Ausgabeergebnis.
drop
create
insert
Die Situation, in der dies benötigt wurde, war, dass ich die Dateien in einer bestimmten Reihenfolge sortieren wollte. Angenommen, Sie haben eine Gruppe solcher Dateien.
0001_create.sql
0001_drop.sql
0001_insert.sql
0002_create.sql
0002_drop.sql
0002_insert.sql
Ich wollte die Dateiliste in der Reihenfolge Präfix + Suffix in der oben genannten Reihenfolge [drop-> create-> insert] erhalten.
Deshalb der Quellcode.
Map<String, Integer> map = new HashMap<>();
map.put("drop.sql", 1);
map.put("create.sql", 2);
map.put("insert.sql", 3);
Files.walk(Paths.get("files"))
.filter(Files::isRegularFile)
.sorted((p1, p2) -> {
String[] sp1 = p1.getFileName().toString().split("_");
String[] sp2 = p2.getFileName().toString().split("_");
String pp1 = sp1[0] + map.get(sp1[1]);
String pp2 = sp2[0] + map.get(sp2[1]);
return pp1.compareTo(pp2);})
.forEach(System.out::println);
Ausgabeergebnis.
files\0001_drop.sql
files\0001_create.sql
files\0001_insert.sql
files\0002_drop.sql
files\0002_create.sql
files\0002_insert.sql
Das ändert nichts an dem, was du tust. Trennen Sie die Dateinamen mit einem Trennzeichen und konvertieren Sie den Suffixteil in eine Ganzzahl in der Sortierreihenfolge mit einer charakteristischen Funktionszuordnung. Wenn Sie sie in der Reihenfolge des Präfixes anhängen, erhalten Sie die Zeichenfolgen "00013", "00012", "00011". "Alles, was Sie tun müssen, ist" compareTo ".
Recommended Posts