J'ai une liste qui ressemble à ceci: [3: [Produit raisonnable], 5: [Excellent]]
Je souhaite trier (à l'aide de flux) cette liste par le numéro avant : .
La liste doit ressembler à ceci:
[5: [Excellent], 3: [Produit raisonnable]]
Mon code ressemble à ceci:
return notesForProduct.stream (). sorted (). collect (Collectors.toList ());
Je ne sais pas comment utiliser la fonction lambda ou ce que je dois mettre en paramètre dans sorted ().
4 Réponses :
Si vous pouvez être sûr du format des éléments de la liste, vous pouvez écrire votre propre comparateur:
Collections.sort(ratingsForProduct, (a, b) -> {
return Integer.parseInt(b.substring(0, b.indexOf(':'))) -
Integer.parseInt(a.substring(0, a.indexOf(':')));
});
Nous utilisons substring (0, indexOf (':')) au lieu de charAt (0) pour gérer les valeurs supérieures à 10. Si vous vouliez trier par ordre croissant, vous changeriez le comparateur pour soustraire b de a (au lieu de a de b car il est actuellement).
Vous pouvez transmettre le comparateur a > pour trier par ordre décroissant en extrayant un entier de chaque chaîne ou vous pouvez également utiliser Collections.sort Collections.sort(list,Comparator.<String>comparingInt(s->Integer.parseInt(s.split(":")[0].trim())).reversed());
List<String> sortedList = list.stream()
.sorted(Comparator.<String>comparingInt(s->Integer.parseInt(s.split(":")[0].trim())).reversed())
.collect(Collectors.toList());
[5 : [Great ], 3 : [Reasonable product ]]
Je pense qu'il est inefficace de convertir une chaîne en entier chaque fois que des chaînes sont comparées.
Essayez ceci.
List<String> result = list.stream()
.map(string -> Map.entry(Integer.valueOf(string.substring(0, string.indexOf(":")).trim()), string))
.sorted(Comparator.comparing(Entry::getKey, Comparator.reverseOrder()))
.map(Entry::getValue)
.collect(Collectors.toList());
ou
List<String> result = list.stream()
.map(string -> new Object() {
int key = Integer.valueOf(string.substring(0, string.indexOf(":")).trim());
String value = string;
})
.sorted(Comparator.comparing(obj -> obj.key, Comparator.reverseOrder()))
.map(obj -> obj.value)
.collect(Collectors.toList());
Voulez-vous dire que vous avez une carte? Ou est-ce que
3: [Produit raisonnable]est une chaîne?3: [Reasonable product]est une chaîne