Home >Java >javaTutorial >How can I sort a Java HashMap by its values in ascending and descending order?

How can I sort a Java HashMap by its values in ascending and descending order?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-03 05:24:09966browse

How can I sort a Java HashMap by its values in ascending and descending order?

Sorting a HashMap by Values

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn