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