wake-up-neo.net

Java 8-Stream-Map zur Liste der nach Werten sortierten Schlüssel

Ich habe map Map<Type, Long> countByType und ich möchte eine Liste haben, die die Schlüssel (min bis max) nach ihren entsprechenden Werten sortiert hat. Mein Versuch ist:

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

dies gibt mir jedoch nur eine Liste von Einträgen. Wie kann ich eine Liste von Typen erhalten, ohne die Reihenfolge zu verlieren?

50
adaPlease

Sie sagen, Sie möchten nach Wert sortieren, haben dies aber nicht in Ihrem Code. Übergeben Sie ein Lambda (oder eine Methodenreferenz) an sorted, um die Sortierreihenfolge anzugeben.

Und Sie wollen die Schlüssel bekommen; Verwenden Sie map, um Einträge in Schlüssel umzuwandeln.

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

Sie müssen mit einem benutzerdefinierten Vergleicher nach dem Wert des Eintrags sortieren. Wählen Sie dann alle Schlüssel vor dem Sammeln aus

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

Sie können eine Karte wie folgt nach Wert sortieren. Weitere Beispiele hier

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

Ausgabe: [A, B, C, D]

2
Kannan Msk

Sie können dies als Beispiel für Ihr Problem verwenden

    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

Hier ist die einfache Lösung mit StreamEx

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