Home >Java >javaTutorial >How Can I Sort a TreeMap by its Values, Not Keys?
Sorting a TreeMap by Value
A TreeMap is a sorted map where the keys are sorted in ascending order by their natural ordering. If a customized sorting is required based on the values, it's necessary to employ a comparator that evaluates the values instead.
One attempt at implementing such a comparator might look like this:
class byValue implements Comparator<Map.Entry<String, Integer>> { public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) { if (e1.getValue() < e2.getValue()) { return 1; } else if (e1.getValue() == e2.getValue()) { return 0; } else { return -1; } } }
However, this approach is flawed because a TreeMap cannot sort based solely on values. It's designed to sort its keys, not the values associated with those keys.
Alternative Solution: Sorting Map.Entry
To overcome this limitation, an external collection can be used to sort the Map.entrySet() collection. This sorted set allows filtering and sorting based on the values. Here's a generic method that sorts Map.entrySet() by values:
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<>( 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; }
Using this method, a sorted set of Map.Entries can be obtained based on values, as demonstrated below:
Map<String, Integer> map = new TreeMap<>(); 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]"
Note on Integer Equality
It's worth noting that the provided code uses == to compare Integer values. This is generally not recommended as it checks for reference equality, not value equality. In some scenarios, it may lead to unexpected results. It's preferable to use methods like compareTo() for value comparisons instead.
The above is the detailed content of How Can I Sort a TreeMap by its Values, Not Keys?. For more information, please follow other related articles on the PHP Chinese website!