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

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

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

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

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

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 newMap = new TreeMap(comp); newMap.putAll(myMap); 

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

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

 Map newMap = new TreeMap(Collections.reverseOrder()); newMap.putAll(myMap); 

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

  TreeMap treeMap = new TreeMap(); NavigableMap  nmap = treeMap.descendingMap(); Set set = nmap.entrySet(); Iterator iterator = set.iterator(); 

теперь u может перебирать iterator и извлекать значение, используя методы iterator.hasNext () и iterator.next () ……

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

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

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

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

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

 ... // 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 } ...