Ce que je veux faire, c'est quand j'ai une liste de chaînes `" insert "," create "," drop "`
, je veux les trier dans l'ordre que j'aime, pas dans l'ordre naturel. Plus précisément, je veux trier dans l'ordre
"drop", "create", "insert" `` `.
Dans ce cas, les éléments de l'ensemble étant limités, en SQL, il suffit de trier par `` cas '' avec la fonction caractéristique. Je veux faire la même chose avec java.
java 1.8
Il a une fonction caractéristique équivalente dans `` Map ''. key est un élément de l'ensemble et value est un entier dans l'ordre de tri.
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);
Résultat de sortie.
drop
create
insert
La situation où cela était nécessaire était que je voulais trier les fichiers dans un ordre particulier. Par exemple, supposons que vous ayez un groupe de fichiers comme celui-ci.
0001_create.sql
0001_drop.sql
0001_insert.sql
0002_create.sql
0002_drop.sql
0002_insert.sql
Je voulais obtenir la liste des fichiers dans l'ordre du préfixe + suffixe dans le [drop-> create-> insert] mentionné ci-dessus.
C'est pourquoi le code source.
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);
Résultat de sortie.
files\0001_drop.sql
files\0001_create.sql
files\0001_insert.sql
files\0002_drop.sql
files\0002_create.sql
files\0002_insert.sql
Cela ne change pas ce que vous faites. Séparez les noms de fichiers par un séparateur et convertissez la partie du suffixe en un entier dans l'ordre de tri avec une table de fonctions caractéristique. Si vous les attachez dans l'ordre du préfixe, vous obtiendrez les chaînes de caractères `" 00013 "," 00012 "," 00011 "`
, donc tout ce que vous avez à faire est `` `compareTo```.
Recommended Posts