2016-11-25 2 views
0
String obtained = transactions.stream() 
    .map(Transaction::getTrader) 
    .map(Trader::getName) 
    .sorted(String::compareTo) 
    .collect(Collectors.joining(",")); 

Que dois-je faire si je veux inverser l'ordre alphabétique naturel dans la chaîne retournée sans écrire une Comparator<String> spécifique, de sorte que le résultat de la chaîne concaténée commence par le nom de z .. ', « y .. », 'x ..' et ainsi de suite?Comment inverser l'ordre des comparateurs à l'aide de l'API de flux?

Répondre

2

En java, quelque chose comme ça peut faire l'affaire:

String obtained = transactions.stream() 
        .map(Transaction::getTrader).map(Trader::getName) 
        .sorted(Comparator.reverseOrder()) 
        .collect(Collectors.joining(",")); 

Notez que cela fonctionne parce que chaîne implémente l'interface Comparable.

+0

C'est ce que j'attendais! Thx, TDRS –

+0

Je pense que vous vouliez dire 'Comparator.reverseOrder()' au lieu de 'Collection' – 4castle

2

Une seule opération est nécessaire pour trier la collection dans l'ordre inverse.

Chaîne implémente Interface comparable. Le javadoc pour java.lang.Comparable # compareTo() dit qu'il retourne:

un entier négatif, nul ou un nombre entier positif que cet objet est inférieure, égale ou supérieure à la objet spécifié

Pour inverser l'ordre de collection, vous pouvez:

  1. [recommandé] u se Comparator.reverseOrder (javadoc) qui

    Renvoie un comparateur qui impose la mise en ordre inverse de l' comparateur spécifié. (...)

    List<String> strings = Arrays.asList("a","b","d", "c", "e"); 
    reversedOrderedStrings = strings.stream() 
              .sorted(Comparator.reverseOrder()) 
              .collect(Collectors.joining(",")); 
    
  2. Ordre inverse des paramètres par rapport

    reversedOrderedStrings = strings.stream() 
              .sorted((s1, s2) -> s2.compareTo(s1)) 
              .collect(Collectors.joining(",")); 
    
  3. [non recommandé] changer le signe de la méthode compareTo(). Ce n'est pas recommandée car elle peut provoquer le débordement numérique pour Integer.MIN_VALUE

    reversedOrderedStrings = strings.stream() 
              .sorted((s1, s2) -> -s1.compareTo(s2)) 
              .collect(Collectors.joining(",")); 
    

sortie pour tous est le même:

System.out.println(reversedOrderedStrings); 
e,d,c,b,a 
+1

Vous avez raison, mais la question dit de ne pas écrire votre propre comparateur. Je reconnais que votre méthode est plus rapide et doit être utilisée. –

+0

Oui, je sais que je peux le faire, je cherchais la méthode Collection.reverseOrder(). –

+0

J'aurais dû utiliser "trié (Comparator.reverseOrder())" dans ma réponse comme décrit dans [Reverse un comparateur en Java 8] (http://stackoverflow.com/questions/32995559/reverse-a-comparator-in- java-8). – gr7