Вы не можете иметь саму сортировку TreeMap
по значениям, поскольку она не соответствует спецификации SortedMap
:
A Map
, который дополнительно обеспечивает общий порядок на его клавишах .
Однако, используя внешнюю коллекцию, вы всегда можете отсортировать Map.entrySet()
по своему желанию, либо по ключам, значениям или даже по комбинации (!!) двух.
Вот обобщенный метод, который возвращает SortedSet
из Map.Entry
, учитывая Map
со значениями Comparable
:
static <K,V extends Comparable<? super V>>
SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map) {
SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
new Comparator<Map.Entry<K,V>>() {
@Override public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
int res = e1.getValue().compareTo(e2.getValue());
return res != 0 ? res : 1;
}
}
);
sortedEntries.addAll(map.entrySet());
return sortedEntries;
}
Теперь вы можете делать следующее:
Map<String,Integer> map = new TreeMap<String,Integer>();
map.put("A", 3);
map.put("B", 2);
map.put("C", 1);
System.out.println(map);
// prints "{A=3, B=2, C=1}"
System.out.println(entriesSortedByValues(map));
// prints "[C=1, B=2, A=3]"
Обратите внимание, что прикольные вещи произойдут, если вы попытаетесь изменить либо SortedSet
, либо Map.Entry
внутри, потому что это больше не «вид» исходной карты, как entrySet()
.
Вообще говоря, необходимость сортировки записей карты по ее значениям нетипична.
Примечание на ==
для Integer
Ваш оригинальный компаратор сравнивает Integer
, используя ==
. Это почти всегда неверно, поскольку ==
с операндами Integer
является ссылочным равенством, а не равенством значений.
System.out.println(new Integer(0) == new Integer(0)); // prints "false"!!!
Похожие вопросы