首页 >Java >java教程 >如何按 Java HashMap 的值升序和降序对 Java HashMap 进行排序?

如何按 Java HashMap 的值升序和降序对 Java HashMap 进行排序?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-03 05:24:09976浏览

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

按值对 HashMap 进行排序

在 Java 中,HashMap 是一个未排序的键值对集合。要按 HashMap 的值对 HashMap 进行排序,我们可以使用外部排序算法,因为 HashMap 本身没有提供内置的排序方法。

一种常见的方法是将 HashMap 转换为其链表项,按值对链表进行排序,然后重建 HashMap。为了确保键值对在此过程中保持链接,我们使用比较器来比较值,同时保留原始键值排序。

以下代码片段演示了这种方法:

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());
        }
    }
}

此代码通过实现一个比较器来演示升序和降序排序,该比较器在保留原始键值关系的同时评估值。

以上是如何按 Java HashMap 的值升序和降序对 Java HashMap 进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn