3
votes

Comment trier les lignes avec condition à l'aide de l'API de flux

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);


0 commentaires

3 Réponses :


4
votes

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);


5 commentaires

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 >?



1
votes

Comparator.comparingInt(String::length).reversed().thenComparing(Comparator.naturalOrder())


0 commentaires

1
votes
phones.stream()
      .sorted((a,b) -> b.length()-a.length() == 0? a.compareTo(b) : b.length()-a.length())
      .forEach(System.out::println);

2 commentaires

Ajoutez une petite explication, cela peut être utile.


pourrait éventuellement être amélioré en Comparator comparator = (o1, o2) -> o2.length () == o1.length ()? o1.compareTo (o2): Integer.compare (o2.length (), o1.length ());