Сортировка по убыванию: Карта 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);
Это кажется плохим подходом, потому что я считаю, что это неэффективно. Есть ли способ изменить решение в ссылке, чтобы упорядочить по убыванию по умолчанию.
Ответы
Ответ 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");