Java 8 потоковая карта в список ключей, отсортированных по значениям
У меня есть карта Map<Type, Long> countByType
, и я хочу иметь список, который отсортировал (от min до max) ключи по их соответствующим значениям. Моя попытка:
countByType.entrySet().stream().sorted().collect(Collectors.toList());
однако это просто дает мне список записей, как я могу получить список типов, не теряя порядок?
Ответы
Ответ 1
Вы говорите, что хотите сортировать по значению, но у вас его нет в коде. Передайте lambda (или ссылку на метод) в sorted
, чтобы рассказать, как вы хотите сортировать.
И вы хотите получить ключи; используйте map
для преобразования записей в ключи.
List<Type> types = countByType.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getValue))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
Ответ 2
Вам нужно сортировать с помощью специализированного компаратора в зависимости от значения записи. Затем выберите все клавиши перед сборкой
countByType.entrySet()
.stream()
.sorted((e1, e2) -> e1.getValue().compareTo(e2.getValue())) // custom Comparator
.map(e -> e.getKey())
.collect(Collectors.toList());
Ответ 3
Вы можете сортировать карту по значению, как показано ниже, более подробно здесь
//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()));
Ответ 4
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]
Ответ 5
Вот простое решение с StreamEx
EntryStream.of(countByType).sortedBy(e -> e.getValue()).keys().toList();