How to Sort a Map in Java

Maps in Java are an essential part of any developer’s toolkit. They provide a powerful way to associate keys with values, but by default, they don’t maintain any specific order. Sometimes, though, we may need to sort the elements of a map based on certain criteria. Fortunately, Java provides several approaches to achieve this. In this blog post, we’ll explore different methods to sort a map in Java.

1. Using TreeMap

The TreeMap class in Java implements the SortedMap interface, which means it automatically sorts the keys in natural order or based on a custom comparator. To sort a map by its keys, we can create a new TreeMap and copy the elements of the original map into it. Here’s how to do it:

import java.util.*;

public class SortMapUsingTreeMap {
    public static void main(String[] args) {
        // Create the original map
        Map<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("John", 25);
        unsortedMap.put("Alice", 30);
        unsortedMap.put("Bob", 20);

        // Sort the map by its keys
        Map<String, Integer> sortedMap = new TreeMap<>(unsortedMap);

        // Print the sorted map
        for (Map.Entry<String, Integer> entry : sortedMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

The output will be:

Alice: 30
Bob: 20
John: 25

2. Using LinkedHashMap and Custom Comparator

If you want to sort a map based on its values rather than keys, you can use the LinkedHashMap and provide a custom comparator. Here’s an example:

import java.util.*;

public class SortMapUsingValueComparator {
    public static void main(String[] args) {
        // Create the original map
        Map<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("John", 25);
        unsortedMap.put("Alice", 30);
        unsortedMap.put("Bob", 20);

        // Sort the map by its values using a custom comparator
        List<Map.Entry<String, Integer>> entries = new ArrayList<>(unsortedMap.entrySet());
        entries.sort(Map.Entry.comparingByValue());

        // Create a LinkedHashMap to maintain the order of insertion
        Map<String, Integer> sortedMap = new LinkedHashMap<>();
        for (Map.Entry<String, Integer> entry : entries) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }

        // Print the sorted map
        for (Map.Entry<String, Integer> entry : sortedMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

The output will be:

Bob: 20
John: 25
Alice: 30

3. Using Java Stream API

Starting from Java 8, you can also use the Stream API to sort a map based on keys or values. This approach is concise and offers a functional programming style:

import java.util.*;

public class SortMapUsingStreamAPI {
    public static void main(String[] args) {
        // Create the original map
        Map<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("John", 25);
        unsortedMap.put("Alice", 30);
        unsortedMap.put("Bob", 20);

        // Sort the map by its keys using Stream API
        Map<String, Integer> sortedByKeyMap = unsortedMap.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByKey())
                .collect(LinkedHashMap::new, (map, entry) -> map.put(entry.getKey(), entry.getValue()), LinkedHashMap::putAll);

        // Sort the map by its values using Stream API
        Map<String, Integer> sortedByValueMap = unsortedMap.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(LinkedHashMap::new, (map, entry) -> map.put(entry.getKey(), entry.getValue()), LinkedHashMap::putAll);

        // Print the sorted maps
        System.out.println("Sorted by keys:");
        for (Map.Entry<String, Integer> entry : sortedByKeyMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        System.out.println("Sorted by values:");
        for (Map.Entry<String, Integer> entry : sortedByValueMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

The output will be:

Sorted by keys:
Alice: 30
Bob: 20
John: 25

Sorted by values:
Bob: 20
John: 25
Alice: 30

Conclusion

Sorting a map in Java can be achieved using various methods, depending on whether you want to sort by keys or values. The TreeMap, LinkedHashMap with a custom comparator, or Java Stream API are powerful tools to handle this task efficiently. Depending on your use case, choose the method that best fits your requirements and enjoy the benefits of sorted maps in your Java applications!