Сортировка TreeMap по значению (BigDecimal)

457
04 апреля 2017, 10:29

Есть объект типа 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());

Как можно произвести сортировку?

Answer 1

Сортировка в 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]
Answer 2

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();
    }
});
READ ALSO
Работа с изображениями на Android

Работа с изображениями на Android

ПриветствуюДля проекта требуется работать с изображениями, а именно: взять изображение из drawable, по заданным координатам вставить картинки...

398
КАК выполнить метод друг за другом?

КАК выполнить метод друг за другом?

У меня есть метод TIMER_funk()

315
Как опубликовать сайт на java сервлетах?

Как опубликовать сайт на java сервлетах?

Есть проект(maven) на java-сервлетах, написан в ideaЛокально работает через томкат

347