Home >Java >javaTutorial >How can I sort a Java HashMap by its values in ascending and descending order?
In Java, a HashMap is an unsorted collection of key-value pairs. To sort a HashMap by its values, we can use external sorting algorithms, as the HashMap itself doesn't provide an in-built sorting method.
One common approach is to convert the HashMap into a linked list of its entries, sort the linked list by value, and then rebuild the HashMap. To ensure that the key-value pairs remain linked during this process, we use a comparator that compares values while preserving the original key-value ordering.
The following code snippet demonstrates this approach:
import java.util.*; public class HashMapSorting { private static final boolean ASC = true; private static final boolean DESC = false; public static void main(String[] args) { // Creating dummy unsorted HashMap HashMap<String, Integer> unsortedMap = new HashMap<>(); unsortedMap.put("B", 55); unsortedMap.put("A", 80); unsortedMap.put("D", 20); unsortedMap.put("C", 70); System.out.println("Before sorting..."); printMap(unsortedMap); System.out.println("After sorting ascending order..."); Map<String, Integer> sortedMapAsc = sortByValue(unsortedMap, ASC); printMap(sortedMapAsc); System.out.println("After sorting descending order..."); Map<String, Integer> sortedMapDesc = sortByValue(unsortedMap, DESC); printMap(sortedMapDesc); } private static <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sortByValue(Map<K, V> unsorted, final boolean order) { List<Map.Entry<K, V>> list = new LinkedList<>(unsorted.entrySet()); list.sort((o1, o2) -> order ? o1.getValue().compareTo(o2.getValue()) == 0 ? o1.getKey().compareTo(o2.getKey()) : o1.getValue().compareTo(o2.getValue()) : o2.getValue().compareTo(o1.getValue()) == 0 ? o2.getKey().compareTo(o1.getKey()) : o2.getValue().compareTo(o1.getValue())); return list.stream().collect( Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b, LinkedHashMap::new ) ); } private static void printMap(Map<String, Integer> map) { for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } } }
This code demonstrates both ascending and descending order sorting by implementing a comparator that evaluates the values while preserving the original key-value relationships.
The above is the detailed content of How can I sort a Java HashMap by its values in ascending and descending order?. For more information, please follow other related articles on the PHP Chinese website!