Сортировка Map по значению с сохранением результата в HashMap
import java.util.Map;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<Integer, Double> map = new HashMap<Integer, Double>();
map.put(1, 10.0);
map.put(2, 30.0);
map.put(3, 50.0);
map.put(4, 40.0);
map.put(5, 100.0);
map.put(6, 60.0);
map.put(7, 110.0);
map.put(8, 50.0);
map.put(9, 90.0);
map.put(10, 70.0);
map.put(11, 80.0);
map.entrySet().stream()
.sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
.forEach(System.out::println); // или любой другой конечный метод
}
}
Нашел пример тут, сортировка Map по значению и он отлично работает, вот только ума не приложу, как сохранить результат в HashMap минуя вывод в консоль?
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
HashMap не сохраняет порядок ключей, используйте LinkedHashMap
Пример:
...
Map<Integer, Double> newMap = new LinkedHashMap<>();
map.entrySet()
.stream()
.sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
.forEach(entry -> newMap.put(entry.getKey(), entry.getValue()));
System.out.println(newMap);
Результат:
{7=110.0, 5=100.0, 9=90.0, 11=80.0, 10=70.0, 6=60.0, 3=50.0, 8=50.0, 4=40.0, 2=30.0, 1=10.0}
Автор решения: Alex Rudenko
→ Ссылка
"Правильнее" будет не добавлять в существующую мапу (которая должна быть LinkedHashMap), а использовать коллектор toMap с указанием Supplier<Map> (тогда также придется указать функцию слияния):
Map<Integer, Double> sortedByValue = map.entrySet()
.parallelStream()
.sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(a, b) -> a,
LinkedHashMap::new
));
Этот вариант будет работать в случае применения параллельного стрима, тогда как forEach придётся заменить на forEachOrdered.