web-dev-qa-db-fra.com

Mappage de flux Java 8 vers une liste de clés triées par valeurs

J'ai map Map<Type, Long> countByType et je veux avoir une liste qui a trié les clés (min à max) par leurs valeurs correspondantes. Mon essai est:

countByType.entrySet().stream().sorted().collect(Collectors.toList());

cependant, cela me donne juste une liste d'entrées, comment puis-je obtenir une liste de types sans perdre la commande?

50
adaPlease

Vous dites que vous voulez trier par valeur, mais vous ne l'avez pas dans votre code. Passez un lambda (ou une référence de méthode) à sorted pour lui indiquer comment vous souhaitez trier.

Et vous voulez obtenir les clés; utilisez map pour transformer les entrées en clés.

List<Type> types = countByType.entrySet().stream()
        .sorted(Comparator.comparing(Map.Entry::getValue))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
107
Jesper

Vous devez trier avec un comparateur personnalisé en fonction de la valeur de l'entrée. Ensuite, sélectionnez toutes les clés avant de collecter

countByType.entrySet()
           .stream()
           .sorted((e1, e2) -> e1.getValue().compareTo(e2.getValue())) // custom Comparator
           .map(e -> e.getKey())
           .collect(Collectors.toList());
11

Vous pouvez trier une carte par valeur comme ci-dessous, plus d’exemple ici

//Sort a Map by their Value.
Map<Integer, String> random = new HashMap<Integer, String>();

random.put(1,"z");
random.put(6,"k");
random.put(5,"a");
random.put(3,"f");
random.put(9,"c");

Map<Integer, String> sortedMap =
        random.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                        (e1, e2) -> e2, LinkedHashMap::new));
System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray()));
3
Ajay
Map<Integer, String> map = new HashMap<>();
map.put(1, "B");
map.put(2, "C");
map.put(3, "D");
map.put(4, "A");

List<String> list = map.values().stream()
    .sorted()
    .collect(Collectors.toList());

Sortie: [A, B, C, D]

2
Kannan Msk

Vous pouvez utiliser ceci comme exemple de votre problème

    Map<Integer, String> map = new HashMap<>();
    map.put(10, "Apple");
    map.put(20, "orange");
    map.put(30, "banana");
    map.put(40, "watermelon");
    map.put(50, "dragonfruit");

    // split a map into 2 List
    List<Integer> resultSortedKey = new ArrayList<>();
    List<String> resultValues = map.entrySet().stream()
            //sort a Map by key and stored in resultSortedKey
            .sorted(Map.Entry.<Integer, String>comparingByKey().reversed())
            .peek(e -> resultSortedKey.add(e.getKey()))
            .map(x -> x.getValue())
            // filter banana and return it to resultValues
            .filter(x -> !"banana".equalsIgnoreCase(x))
            .collect(Collectors.toList());

    resultSortedKey.forEach(System.out::println);
    resultValues.forEach(System.out::println);
1
MADHUR GUPTA

Voici la solution simple avec StreamEx

EntryStream.of(countByType).sortedBy(e -> e.getValue()).keys().toList();
1
user_3380739