1. Introduction
In this article, We'll learn how to sort Map by Values in ascending or descending order. In the previous article discussed how to sort the TreeMap in ascending or reverse order.
Map can be anything such as HashMap or TreeMap which needs to be sorted based on its values rather than keys.
Always, TreeMap does sorting based on its keys but not on values, but in the interview first, they will ask how to sort the Map. If you give the answer then the next question is on sorting values alone.
2. Custom comparator Sorting based on Value
First, let us create a custom comparator which sorts based on the values instead of keys. The below method takes Map as an argument and writes a logic for the custom comparator. This comparator logic gets the corresponding value for a key from the map passed as an argument and compares against values.
Finally, Create a new TreemMap and pass the custom value comparator to this new map. Add all values from the map passed to the new TreeMap created.
public static> Map sortByValues(final Map map) {
// custom comparator based don values.
ComparatorvalueComparator = new Comparator () {
public int compare(K k1, K k2) {
V v1 = map.get(k1);
V v2 = map.get(k2);
int compare = v1.compareTo(v2);
if (compare == 0) {
return 1;
} else {
return compare;
}
}
};
// Creating a new TreeMap
MapsortedByValues = new TreeMap (valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
But, Here need to have noted on the point is that directly we can not sort the original TreeMap upon values. We need to create a new TreeMap with a custom comparator.
Now let us create a TreeMap and add a few values to it. Call the above sortByValues() method by passing the map.
3. TreeMap sort by value
Now let us create a TreeMap and add a few values to it. Call the above sortByValues() method by passing the map.
package com.java.w3schools.blog.treemap;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
public class TreeMapSortByValue {
public static void main(String args[]) {
TreeMaptreemap = new TreeMap ();
treemap.put("3 IN", "India");
treemap.put("1 US", "United States");
treemap.put("2 AUS", "Australia");
treemap.put("5 PAK", "Pakistan");
treemap.put("4 UK", "United Kingdom");
System.out.println("Treemap before sorting : " + treemap);
// sort treemap by values
Map sortedMap = sortByValues(treemap);
System.out.println("Treemap after sorting : " + sortedMap);
}
public static> Map sortByValues(final Map map) {
// custom comparator based don values.
ComparatorvalueComparator = new Comparator () {
public int compare(K k1, K k2) {
V v1 = map.get(k1);
V v2 = map.get(k2);
int compare = v1.compareTo(v2);
if (compare == 0) {
return 1;
} else {
return compare;
}
}
};
// Creating a new TreeMap
MapsortedByValues = new TreeMap (valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
}
Output:
Now, We write a logic to sort hashmap by value. The same logic works for HashMap as well. Just need to pass the HashMap object to the sortByValues() method.
Output:
Java 8 Stream API has support to sort by key for a Map.
stream(): converts the keys set into Stream<Entry<K, V>
sorted(Map.Entry.comparingByValue()): Sorts the entry set by value using comparingByValue() comparator.
Collectors.toMap(): Collects the output into map.
collect() method is part of the Terminal Operations.
Output:
In this article, We've seen how to sort TreeMap or HashMap by value instead of key, TreeMap sorts by key by default. And seen how to build the custom comparator to sort by value.
GitHub Code
StackOverFlow
Treemap before sorting : {1 US=United States, 2 AUS=Australia, 3 IN=India, 4 UK=United Kingdom, 5 PAK=Pakistan}
Treemap after sorting : {2 AUS=Australia, 3 IN=India, 5 PAK=Pakistan, 4 UK=United Kingdom, 1 US=United States}
4. Sort HashMap By Value
Now, We write a logic to sort hashmap by value. The same logic works for HashMap as well. Just need to pass the HashMap object to the sortByValues() method.
MaphashMapObject = new HashMap ();
hashMapObject.put("1", "One");
hashMapObject.put("2", "Two");
hashMapObject.put("3", "Three");
hashMapObject.put("4", "Four");
hashMapObject.put("5", "FIve");
System.out.println("HashMap before sorting : " + hashMapObject);
// sort treemap by values
Map sortedHashMap = sortByValues(hashMapObject);
System.out.println("HashMap after sorting : " + sortedHashMap);
Output:
HashMap before sorting : {1=One, 2=Two, 3=Three, 4=Four, 5=FIve}
HashMap after sorting : {5=FIve, 4=Four, 1=One, 3=Three, 2=Two}
5. Java 8 Sort By Value
Java 8 Stream API has support to sort by key for a Map.
stream(): converts the keys set into Stream<Entry<K, V>
sorted(Map.Entry.comparingByValue()): Sorts the entry set by value using comparingByValue() comparator.
Collectors.toMap(): Collects the output into map.
collect() method is part of the Terminal Operations.
// java 8 sorting
Mapjava8HashMapApproach = hashMapObject.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
System.out.println("Java 8 HashMap : " + java8HashMapApproach);
Mapjava8TreeMapApproach = treemap.entrySet().stream().sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
System.out.println("Java 8 TreeMap : " + java8TreeMapApproach);
Java 8 HashMap : {5=FIve, 4=Four, 1=One, 3=Three, 2=Two}
Java 8 TreeMap : {2 AUS=Australia, 3 IN=India, 5 PAK=Pakistan, 4 UK=United Kingdom, 1 US=United States}
6. Conclusion
In this article, We've seen how to sort TreeMap or HashMap by value instead of key, TreeMap sorts by key by default. And seen how to build the custom comparator to sort by value.
GitHub Code
0 Comments