首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Map 依據 Value 值排序的完整實作範例

     編輯:Java 相關知識

前言

在 Java 開發中,Map 是最常用的資料結構之一,但 Map 本身不保證順序。當我們需要根據 Value(值)對 Map 進行排序時,就需要一些額外的技巧。本文將詳細介紹如何實現 Map 按 Value 排序,並提供完整可執行的程式碼範例。

核心思路

Map 本身不支援直接按 Value 排序,主要步驟如下:

  1. 將 Map 的 entrySet() 轉換為 List
  2. 使用 Collections.sort() 搭配自訂 Comparator 進行排序
  3. 將排序後的結果存入 LinkedHashMap 以保持順序

完整程式碼範例

import java.util.*;

public class MapSortByValue {
    public static void main(String[] args) {
        // 建立測試資料
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 50);
        map.put("banana", 20);
        map.put("orange", 80);
        map.put("grape", 30);
        map.put("pear", 10);

        System.out.println("原始 Map(無序):");
        map.forEach((k, v) -> System.out.println(k + " = " + v));

        // 按 Value 升序排序
        Map<String, Integer> sortedMap = sortByValue(map, true);
        System.out.println("\n按 Value 升序排序:");
        sortedMap.forEach((k, v) -> System.out.println(k + " = " + v));

        // 按 Value 降序排序
        Map<String, Integer> sortedMapDesc = sortByValue(map, false);
        System.out.println("\n按 Value 降序排序:");
        sortedMapDesc.forEach((k, v) -> System.out.println(k + " = " + v));
    }

    /**
     * 根據 Map 的 Value 進行排序
     * @param map 待排序的 Map
     * @param ascending true 為升序,false 為降序
     * @return 排序後的 LinkedHashMap(保持插入順序)
     */
    public static <K, V extends Comparable<V>> Map<K, V> sortByValue(Map<K, V> map, boolean ascending) {
        // 1. 將 entrySet 轉為 List
        List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());

        // 2. 使用 Comparator 進行排序
        list.sort((e1, e2) -> {
            int result = e1.getValue().compareTo(e2.getValue());
            return ascending ? result : -result;
        });

        // 3. 存入 LinkedHashMap 保持順序
        Map<K, V> sortedMap = new LinkedHashMap<>();
        for (Map.Entry<K, V> entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }
        return sortedMap;
    }
}

程式碼解析

關鍵點說明

  • List 轉換:Map.Entry 實作了 Comparable 介面,但預設比較 Key,我們需要自訂比較邏輯
  • Lambda 表達式:Java 8+ 可使用 Lambda 簡化 Comparator 寫法
  • LinkedHashMap:維持插入順序,是保存排序結果的關鍵
  • 泛型限定:V extends Comparable<V> 確保 Value 可比較

進階:Java 8 Stream API 寫法

使用 Stream API 可以更簡潔地完成排序:

// 升序
Map<String, Integer> sorted = map.entrySet().stream()
    .sorted(Map.Entry.comparingByValue())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (e1, e2) -> e1,
        LinkedHashMap::new
    ));

// 降序
Map<String, Integer> sortedDesc = map.entrySet().stream()
    .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (e1, e2) -> e1,
        LinkedHashMap::new
    ));

效能考量

方法時間複雜度空間複雜度適用場景
Collections.sort + ListO(n log n)O(n)通用、相容性好
Stream APIO(n log n)O(n)Java 8+、程式碼簡潔
TreeMap (按 Key 排序)O(n log n)O(n)需同步維護 Key 順序

常見陷阱與注意事項

  1. Value 為 null:比較時會拋出 NullPointerException,需預先處理
  2. Value 不可比較:未實作 Comparable 介面的物件無法直接排序
  3. 重複 Value:排序不穩定時,相同 Value 的 Key 順序不定,可加入 Key 作為次要排序條件
  4. 原始 Map 不變:排序會產生新 Map,原 Map 保持不變

總結

Map 按 Value 排序的核心在於「轉 List → 排序 → 存 LinkedHashMap」。掌握這個模式後,無論是傳統寫法還是 Stream API,都能輕鬆應對各種排序需求。實務上建議根據專案 Java 版本選擇適合的寫法,並注意處理邊界情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved