1
votes

Trier un nombre décroissant de flux

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 ().


2 commentaires

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


4 Réponses :


1
votes

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


0 commentaires

3
votes

Vous pouvez transmettre le comparateur a > pour trier par ordre décroissant en extrayant un entier de chaque chaîne

Collections.sort(list,Comparator.<String>comparingInt(s->Integer.parseInt(s.split(":")[0].trim())).reversed());

ou vous pouvez également utiliser Collections.sort

List<String> sortedList = list.stream()
            .sorted(Comparator.<String>comparingInt(s->Integer.parseInt(s.split(":")[0].trim())).reversed())
            .collect(Collectors.toList());


0 commentaires

1
votes
[5 : [Great ], 3 : [Reasonable product ]]

0 commentaires

1
votes

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


0 commentaires