it-swarm.com.ru

Карта потока Java 8 к списку ключей, отсортированных по значениям

У меня есть карта Map<Type, Long> countByType, и я хочу иметь список, который отсортировал (от мин до макс) ключи по их соответствующим значениям. Моя попытка:

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

однако это просто дает мне список записей, как я могу получить список типов, не теряя порядок?

50
adaPlease

Вы говорите, что хотите отсортировать по значению, но в вашем коде этого нет. Передайте лямбда (или ссылку на метод) в sorted, чтобы сообщить, как вы хотите сортировать.

И вы хотите получить ключи; используйте map для преобразования записей в ключи.

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

Вы должны отсортировать с помощью специального компаратора на основе значения записи. Затем выберите все ключи, прежде чем собирать

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

Вы можете отсортировать карту по значению, как показано ниже, больше примеров здесь

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

Вывод: [A, B, C, D]

2
Kannan Msk

Вы можете использовать это как пример вашей проблемы

    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

Вот простое решение с StreamEx

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