Подтвердить что ты не робот

Сортировка по убыванию: Карта Java

Что я хочу сделать, так это сортировать карту по значению. Я просмотрел много вопросов, которые доступны на сайте stackoverflow и выяснил следующее решение, которое делает то, что я хочу, но не хватает маленькой вещи.

Link1: Сортировка карты

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

Итак, что я сделал, я создал класс, который реализует компаратор

class MyComparator implements Comparator {
    Map map;
    public MyComparator(Map map) {
        this.map = map;
    }
    public int compare(Object o1, Object o2) {
        return ((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
    }
}

И затем я передаю свою карту в treemap,

MyComparator comp = new MyComparator(myMap);
Map<String, Integer> newMap = new TreeMap(comp);
newMap.putAll(myMap);

Это кажется плохим подходом, потому что я считаю, что это неэффективно. Есть ли способ изменить решение в ссылке, чтобы упорядочить по убыванию по умолчанию.

4b9b3361

Ответ 1

Вы должны использовать new TreeMap(Collections.reverseOrder());.

Map<String, Integer> newMap = new TreeMap(Collections.reverseOrder());
newMap.putAll(myMap);

или для изменения существующего компаратора, такого как компаратор значений Collections.reverseOrder(comparator) Он работает, как ваш подход, обменивая два объекта перед вызовом compare/compareTo

Ответ 2

    TreeMap<Long,String> treeMap = new TreeMap<Long,String>();

    NavigableMap <Long, String> nmap = treeMap.descendingMap();

    Set<Long, String> set = nmap.entrySet();

    Iterator<Long, String> iterator = set.iterator();

теперь u может перебирать итератор и извлекать значение с помощью методов iterator.hasNext() и iterator.next()......

Ответ 3

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

return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));

Ответ 4

Это будет работать:

      TreeMap<Integer, Integer> reverseInteger=new TreeMap<>(new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o2>o1?1:o2==o1?0:-1;
        }
    });

Ответ 5

Чтобы изменить решение в ссылке для сортировки по убыванию, просто измените условие:

...
// Note: this comparator imposes orderings that are inconsistent with equals.    
public int compare(String a, String b) {
    if (base.get(a) >= base.get(b)) {
        return 1; // For ascending, return -1;
    } else {
        return -1; // For ascending, return 1;
    } // returning 0 would merge keys
}
...

Ответ 6

TreeMap будет автоматически сортировать в порядке возрастания. Если вы хотите отсортировать в порядке убывания, используйте следующий код:

Скопируйте приведенный ниже код в свой класс и за пределы основного метода execute:

static class DescOrder implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
    }

Тогда по твоей логике

TreeMap<String, String> map = new TreeMap<String, String>(new DescOrder());
map.put("A", "test1");
map.put("C", "test3");
map.put("E", "test5");
map.put("B", "test2");
map.put("D", "test4");