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

Java Map 排序完全指南:按 Key 排序與按 Value 排序的多種實現

     編輯:Java 相關知識

核心認知

  • HashMap:無序,O(1) 查詢
  • TreeMap:按 Key 自然順序或 Comparator 排序,紅黑樹實現,O(log n)
  • LinkedHashMap:保持插入順序/訪問順序

Map 本身不支援按 Value 排序,需轉換為 List/Set 再排序。

一、按 Key 排序:TreeMap 一步到位

// 降序排序
Map map = new TreeMap<>((k1, k2) -> k2.compareTo(k1));
map.put("b", "ccccc");
map.put("d", "aaaaa");
map.put("c", "bbbbb");
map.put("a", "ddddd");

// 遍歷輸出:d:aaaaa  c:bbbbb  b:ccccc  a:ddddd
map.forEach((k, v) -> System.out.println(k + ":" + v));

二、按 Value 排序:三種主流方案

方案 1:List + Collections.sort + LinkedHashMap(最通用)

public static > Map sortByValue(Map map) {
    List> list = new ArrayList<>(map.entrySet());
    list.sort(Entry.comparingByValue());  // Java 8+ 語法糖

    Map result = new LinkedHashMap<>();
    for (Map.Entry entry : list) {
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
}

方案 2:TreeSet + 自定義 Comparator(自動去重 Value 相同鍵)

Set> set = new TreeSet<>((e1, e2) -> {
    int cmp = e2.getValue().compareTo(e1.getValue());  // 值降序
    return cmp != 0 ? cmp : e2.getKey().compareTo(e1.getKey());  // 值相同按鍵降序
});
set.addAll(map.entrySet());
// 遍歷 set 即為排序結果

方案 3:Stream API 一行流(Java 8+ 推薦)

Map sorted = map.entrySet().stream()
    .sorted(Map.Entry.comparingByValue())  // 或 .reversed() 降序
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (v1, v2) -> v1,  // 鍵衝突合併策略
        LinkedHashMap::new  // 保持順序
    ));

性能與選型建議

方案時間複雜度空間適用場景
TreeMap (Key排序)O(n log n)O(n)需保持鍵有序的場景
List+Collections.sortO(n log n)O(n)通用 Value 排序,兼容性最好
TreeSetO(n log n)O(n)需去重 Value 相同鍵
Stream APIO(n log n)O(n)Java 8+ 項目,代碼最簡潔

注意事項

  1. Value 必須實現 Comparable 或提供 Comparator
  2. Value 相同鍵的順序:TreeMap 保留最後 put 的;List 方案保留原 Map 迭代順序
  3. 結果必須用 LinkedHashMap 承接,否則順序會丟失
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved