Tri d'une liste avec stream.sorted() en Java


Je suis intéressé par le tri d'une liste à partir d'un flux. C'est le code que j'utilise:

list.stream()
    .sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue()))
    .collect(Collectors.toList());

Est-ce que je manque quelque chose? La liste ne trie pas.

Il devrait trier les listes en fonction de l'élément avec la valeur la plus basse.

for (int i = 0; i < list.size(); i++)
{
   System.out.println("list " + (i+1));
   print(list, i);
}

Et la méthode d'impression:

public static void print(List<List> list, int i)
{
    System.out.println(list.get(i).getItem().getValue());
}
Author: River, 2016-11-10

4 answers

Ce n'est pas comme Collections.sort() où la référence du paramètre est triée. Dans ce cas, vous obtenez simplement un flux trié que vous devez collecter et affecter à une autre variable par la suite:

List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
                                   compareTo(o2.getItem().getValue())).
                                   collect(Collectors.toList());

Vous avez juste manqué d'attribuer le résultat

 65
Author: Matt, 2018-05-17 03:56:49

Utiliser list.sort au lieu de cela:

list.sort((o1, o2) -> o1.getItem().getValue().compareTo(o2.getItem().getValue()));

Et de le rendre plus concis en utilisant Comparator.comparing:

list.sort(Comparator.comparing(o -> o.getItem().getValue()));

Après l'un ou l'autre, list lui-même sera trié.

Votre problème est que list.stream.sorted renvoie les données triées, elles ne trient pas en place comme prévu.

 24
Author: River, 2018-05-17 20:12:56

, Il semble fonctionner correctement:

List<BigDecimal> list = Arrays.asList(new BigDecimal("24.455"), new BigDecimal("23.455"), new BigDecimal("28.455"), new BigDecimal("20.455"));
System.out.println("Unsorted list: " + list);
final List<BigDecimal> sortedList = list.stream().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.toList());
System.out.println("Sorted list: " + sortedList);

Exemple D'Entrée/De Sortie

Unsorted list: [24.455, 23.455, 28.455, 20.455]
Sorted list: [20.455, 23.455, 24.455, 28.455]

Êtes-vous sûr de ne pas vérifier list au lieu de sortedList [dans l'exemple ci-dessus], c'est-à-dire que vous stockez le résultat de stream() dans un nouvel objet List et que vous vérifiez cet objet?

 0
Author: Tanmay Baid, 2017-07-20 17:27:11
Collection<Map<Item, Integer>> itemCollection = basket.values();
Iterator<Map<Item, Integer>> itemIterator =   itemCollection.stream().sorted(new TestComparator()).collect(Collectors.toList()).iterator();



package com.ie.util;

import com.ie.item.Item;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TestComparator implements Comparator<Map<Item, Integer>> {

// comparator is used to sort the Items based on the price


    @Override
    public int compare(Map<Item, Integer> o1, Map<Item, Integer> o2) {


      //  System.out.println("*** compare method will be called *****");


        Item item1 = null;
        Item item2 = null;


        Set<Item> itemSet1 = o1.keySet();
        Iterator<Item> itemIterator1 = itemSet1.iterator();
        if(itemIterator1.hasNext()){
           item1 =   itemIterator1.next();
        }

        Set<Item> itemSet2 = o2.keySet();
        Iterator<Item> itemIterator2 = itemSet2.iterator();
        if(itemIterator2.hasNext()){
            item2 =   itemIterator2.next();
        }


        return -item1.getPrice().compareTo(item2.getPrice());


    }
}

**** ceci est utile pour trier les objets de carte imbriqués comme Map> ici, j'ai trié en fonction du prix de l'objet de l'article .

 0
Author: Venkat IndianEagle, 2018-05-22 05:15:19