J'étudie l'API de flux, j'ai cette tâche. Je dois trier la collection List dans l'ordre de leur longueur, si les longueurs de plusieurs lignes sont identiques, puis les trier par ordre alphabétique.
Mon code:
String a = Abcd; list.add(new Pair(a, a.length));
J'ai eu cette sortie:
Samsung Galaxy S8 Huawei Nexus 6P ASUS Zenfone 3 Sony Xperia Z5 Heizu Pro 6 Meizu Pro 6 Xiaomi MI6 iPhone X Nokia 9 Pixel 2 LG G6
Comme vous voyez les lignes
Meizu Pro 6 Heizu Pro 6
Et les lignes:
Sony Xperia Z5 ASUS Zenfone 3
Mais mon résultat doit être:
Samsung Galaxy S8 Huawei Nexus 6P Sony Xperia Z5 ASUS Zenfone 3 Meizu Pro 6 Heizu Pro 6 Xiaomi MI6 iPhone X Nokia 9 Pixel 2 LG G6
Comment puis-je améliorer mon code pour que si les longueurs sont les mêmes, alors le tri est alphabétique ?
Comment pouvons-nous collecter des résultats dans List>? Où List
par exemple:
List<String> phones = new ArrayList<String>(); Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P", "Samsung Galaxy S8", "LG G6", "Xiaomi MI6", "Sony Xperia Z5", "ASUS Zenfone 3", "Meizu Pro 6", "Heizu Pro 6", "Pixel 2"); phones.stream().sorted(Comparator.comparingInt(String::length).reversed()).forEach(System.out::println);
3 Réponses :
Ajoutez thenComparing ()
à votre chaîne de comparaison pour créer un ordre de tri secondaire. Il sera appliqué lorsque le tri principal ne suffit pas:
phones.stream() .sorted(Comparator.comparingInt(String::length).reversed() .thenComparing(Function.identity())) .forEach(System.out::println);
Soigné. Je ne savais pas qu'il existe un comparateur intégré comme celui-là.
String :: toString
au lieu de String :: compareTo
ne fonctionnerait-il pas également? (demande sincèrement)
Ou Function.identity ()
, je ne sais pas quelle est la meilleure façon de l'exprimer. J'ai modifié ma réponse pour utiliser Function.identity ()
.
thenComparing (Comparator.naturalOrder ())
a beaucoup plus de sens, je crois
comment pouvons-nous collecter les résultats dans List
Comparator.comparingInt(String::length).reversed().thenComparing(Comparator.
phones.stream() .sorted((a,b) -> b.length()-a.length() == 0? a.compareTo(b) : b.length()-a.length()) .forEach(System.out::println);
Ajoutez une petite explication, cela peut être utile.
pourrait éventuellement être amélioré en Comparator