Есть объект типа TreeMap<String,BigDecimal>, который необходимо отсортировать по значению. Пытался таким образом:
Collections.sort(map, new Comparator<Map.Entry<String, BigDecimal>>() {
@Override
public int compare(Map.Entry<String, BigDecimal> a, Map.Entry<String, BigDecimal> b) {
return (a.getValue().subtract(b.getValue()));
}
});
Но строка с return выдает ошибку, т.к. возвращается BigDecimal, а не int.
Попытка
return (a.getValue().subtract(b.getValue())).intValue();
не дала результатов.
Также не помогает запись
return a.getValue().compareTo(b.getValue());
Как можно произвести сортировку?
Сортировка в TreeMap происходит по ключам. Пытаться сортировать его по значениям - плохая затея. В данной ситуации нужно либо BigDecimal делать ключами (если это возможно), либо список пар из map сортировать и сохранять в отдельный список.
Сохранение пар "ключ-значение" из TreeMap<String, BigDecimal> в List<Map.Entry<String, BigDecimal>> в порядке убывания значений:
List<Map.Entry<String, BigDecimal>> list = map.entrySet().stream()
.sorted((e1, e2) -> -e1.getValue().compareTo(e2.getValue()))
.collect(Collectors.toList());
В таком случае для
Map<String, BigDecimal> map = new TreeMap<>();
map.put("a", BigDecimal.ZERO);
map.put("b", BigDecimal.ONE);
map.put("c", BigDecimal.TEN);
Вывод на экран list таков:
[c=10, b=1, a=0]
TreeMap Вы не сможете отсортировать, вы можете при создании задать ей Comparator, в котором установить свои правила сортировки.
Метод compare должен возвращать int значение в любом случае.
Возвращает 0, если объекты равны, отрицательное число, если первый объект меньше второго, и положительное число, если первый больше.
Воспользуйтесь методом .signum() который возвращает int
-1 если число отрицательное, 0 если 0, 1 если число положительное
return a.getValue().subtract(b.getValue()).signum();
Код который решает вашу задачу, просто добавляйте новые элементы и они будут автоматически подставляться по убыванию BigDecimal
TreeMap<BigDecimal, String> treeMap = new TreeMap<>(new Comparator<BigDecimal>() {
@Override
public int compare(BigDecimal o1, BigDecimal o2) {
return -o1.subtract(o2).signum();
}
});
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости