TreeMap Sorting by Value
When working with Java's TreeMap, sorting by the default natural ordering of keys may not always be sufficient. This article explores an alternative approach to sort a TreeMap based on its values.
Problem Description:
You seek a way to design a comparator that allows you to sort a TreeMap by its values instead of the default key ordering. An initial attempt returned an error, prompting questions about passing Map.Entry to the comparator.
Solution:
While it's not possible to sort a TreeMap directly by values, it's feasible to use an external collection to perform this task. By extracting the Map.entrySet(), you can employ a custom comparator to sort the entries based on their values.
The provided generic method, entriesSortedByValues(), achieves this by creating a SortedSet of Map.Entry objects. The method requires the map values to be Comparable and applies a comparator that compares the values to determine the entry ordering.
Implementation:
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; // Handle equal values separately } } ); sortedEntries.addAll(map.entrySet()); return sortedEntries; }
Usage:
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]"
Warning:
Modifying the sorted set or the Map.Entry within it may cause unexpected results, as this is not a "view" of the original map. Additionally, be mindful of using == with Integer objects, as it performs reference equality, not value equality.
The above is the detailed content of How Can I Sort a Java TreeMap by Its Values Instead of Keys?. For more information, please follow other related articles on the PHP Chinese website!