This tutorial shows you how to sort hashmap by key in java using java.util.TreeMap. Beside it also shows how to sort a hashmap in Ascending or Descending order by key or value using a custom Comparator and Java 8 Lambda expression.
Sorted HashMap By Key Example
You sort a java.util.HashMap by putting all the entries in a java.util.TreeMap. It will be sorted automatically. Let’s look at the blow code snippet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.javabycode.sort; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.TreeMap; public class MySortByKey { public static void main(String... args){ Map<Integer, String> random = new HashMap<Integer, String>(); for (int i = 0; i < 10; i++) { random.put((int)(new Random().nextInt(100)), String.valueOf((int) (new Random().nextInt(100)))); } System.out.println("-------------- Map before sorting --------------"); System.out.println("Random Map: " + Arrays.toString(random.entrySet().toArray())); TreeMap<Integer, String> sorted = new TreeMap<Integer, String>(random); System.out.println("-------------- Map after sorting --------------"); System.out.println("Sorted Map: " + Arrays.toString(sorted.entrySet().toArray())); } } |
Output
1 2 3 4 |
-------------- Map before sorting -------------- Random Map: [5=94, 9=9, 90=94, 91=93, 78=73, 30=1, 47=32, 63=73, 15=10] -------------- Map after sorting -------------- Sorted Map: [5=94, 9=9, 15=10, 30=1, 47=32, 63=73, 78=73, 90=94, 91=93] |
Sorted HashMap By Key Reverse using custom comparator
You can sort a java.util.HashMap in descending order by using a custom Comparator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package com.javabycode.sort; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class MySortByKeyReverse { public static void main(String... args){ Map<Integer, String> random = new HashMap<Integer, String>(); for (int i = 0; i < 10; i++) { random.put((int)(new Random().nextInt(100)), String.valueOf((int) (new Random().nextInt(100)))); } System.out.println("-------------- Map before sorting --------------"); System.out.println("Initial Map: " + Arrays.toString(random.entrySet().toArray())); TreeMap<Integer, String> sorted = new TreeMap<Integer, String>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } }); sorted.putAll(random); System.out.println("-------------- Map after sorting --------------"); System.out.println("Sorted Map: " + Arrays.toString(sorted.entrySet().toArray())); } } |
Output
1 2 3 4 |
-------------- Map before sorting -------------- Initial Map: [64=9, 65=71, 17=31, 83=61, 5=25, 7=87, 40=69, 26=90, 44=95, 29=11] -------------- Map after sorting -------------- Sorted Map: [83=61, 65=71, 64=9, 44=95, 40=69, 29=11, 26=90, 17=31, 7=87, 5=25] |
Sorted HashMap By Value using custom comparator
You can sort a java.util.HashMap by value by using a custom Comparator. Let’s create a custom Comparator with name ValueComparator such as:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.javabycode.sort; import java.util.Comparator; import java.util.Map; public class ValueComparator implements Comparator<Integer>{ private Map<Integer, String> map; public ValueComparator(Map<Integer, String> map) { this.map = map; } @Override public int compare(Integer a, Integer b) { return map.get(a).compareTo(map.get(b)); } } |
And we can use the ValueComparator to sort a HashMap by Value.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.javabycode.sort; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class MySortByValue { public static void main(String... args){ Map<Integer, String> random = new HashMap<Integer, String>(); for (int i = 0; i < 10; i++) { random.put((int)(new Random().nextInt(100)), String.valueOf((int) (new Random().nextInt(100)))); } System.out.println("-------------- Map before sorting --------------"); System.out.println("Random Map: " + Arrays.toString(random.entrySet().toArray())); TreeMap<Integer, String> sorted = new TreeMap<Integer, String>(new ValueComparator(random)); sorted.putAll(random); System.out.println("-------------- Map after sorting --------------"); System.out.println("Sorted Map: " + Arrays.toString(sorted.entrySet().toArray())); } } |
Output
1 2 3 4 |
-------------- Map before sorting -------------- Random Map: [96=84, 64=0, 81=13, 98=81, 18=62, 85=86, 56=76, 11=56, 12=66] -------------- Map after sorting -------------- Sorted Map: [64=0, 81=13, 11=56, 18=62, 12=66, 56=76, 98=81, 96=84, 85=86] |
Java 8 Lambda Sorted Map By Value
It’s easy for you to sort java.util.HashMap by value in Java 8. You can just do it because Java 8 has a new streaming API on top of the collections framework.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package com.javabycode.sort; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Random; import java.util.stream.Collectors; public class MySortByValueLambda { public static void main(String... args){ Map<Integer, String> random = new HashMap<Integer, String>(); for (int i = 0; i < 10; i++) { random.put((int)(new Random().nextInt(100)), String.valueOf((int) (new Random().nextInt(100)))); } System.out.println("-------------- Map before sorting --------------"); System.out.println("Random Map: " + Arrays.toString(random.entrySet().toArray())); Map<Integer, String> sortedMap = random.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); System.out.println("-------------- Map after sorting --------------"); System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray())); } } |
Output
1 2 3 4 |
-------------- Map before sorting -------------- Random Map: [81=98, 54=65, 88=17, 10=99, 75=58, 45=57, 61=84, 14=26, 78=27] -------------- Map after sorting -------------- Sorted Map: [88=17, 14=26, 78=27, 45=57, 75=58, 54=65, 61=84, 81=98, 10=99] |
That’s it on how to sort hashmap by key in Java. I hope you can use these tips to optimize your source code and increate performace of program.