Создайте отсортированный HashMap из Stream Java 8 - PullRequest
1 голос
/ 19 сентября 2019

Я конвертирую HashMap<String, Double> в HashMap<String, Double>, где содержимое сортируется по значению.Когда я распечатываю следующее:

Stream<Map.Entry<String, Double>> sorted = map.entrySet().stream()
    .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).forEach(System.out::println);

, данные распечатываются в правильном порядке, отсортированном по значению.Однако мне не нужно распечатывать данные, я хочу свернуть содержимое этого потока в новый HashMap с новым отсортированным порядком.Я попробовал несколько вариантов, но мне кажется, что я получаю свой исходный несортированный HashMap, когда я делаю это:

return map.entrySet()
    .stream()
    .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
    .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue()));

Как я могу изменить поток так, чтобы я отправлял обратно отсортированный HashMap?

1 Ответ

5 голосов
/ 19 сентября 2019

Используемый вами коллектор создает HashMap по умолчанию, а HashMap не имеет порядка.

Вы можете использовать другой коллектор, который будет производить LinkedHashMap, который сохраняет порядок вставки:

return map.entrySet()
    .stream()
    .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
    .collect(Collectors.toMap(entry -> entry.getKey(), 
                              entry -> entry.getValue(),
                              (a,b)->a,
                              LinkedHashMap::new));
...