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

Java Map 排序實戰:TreeMap + Comparator 實現中文按拼音/筆畫自定義排序

     編輯:Java 綜合教學

Java Map 排序實戰:TreeMap + Comparator 實現中文按拼音/筆畫自定義排序

TreeMap 默認按 Key 自然順序排序(數字/字母),但中文 Key 需按拼音或筆畫排序時,必須提供自定義 Comparator。本文提供基於 RuleBasedCollator 的完整實現,支援中文本地化排序規則。

一、核心代碼:中文拼音排序 TreeMap

import java.text.Collator;
import java.text.RuleBasedCollator;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class ChineseSortedMapDemo {
    public static void main(String[] args) {
        // 構建支援中文排序的 TreeMap
        Map bankGroup = new TreeMap<>(new ChineseComparator());

        // 測試數據
        bankGroup.put("中國銀行", "BOC");
        bankGroup.put("農業銀行", "ABC");
        bankGroup.put("工商銀行", "ICBC");
        bankGroup.put("建設銀行", "CCB");
        bankGroup.put("交通銀行", "BOCOM");
        bankGroup.put("招商銀行", "CMB");

        // 輸出:按拼音順序排列
        bankGroup.forEach((k, v) -> System.out.println(k + " -> " + v));
        /*
        輸出結果:
        農業銀行 -> ABC
        招商銀行 -> CMB
        建設銀行 -> CCB
        交通銀行 -> BOCOM
        工商銀行 -> ICBC
        中國銀行 -> BOC
        */
    }

    /** 中文拼音排序 Comparator */
    static class ChineseComparator implements Comparator {
        // 獲取中文環境的 RuleBasedCollator(支援拼音/筆畫規則)
        private final RuleBasedCollator collator = (RuleBasedCollator) Collator.getInstance(java.util.Locale.CHINA);

        @Override
        public int compare(String o1, String o2) {
            // 空值保護
            if (o1 == null || o2 == null) return 0;

            // 獲取排序鍵並比較
            return collator.getCollationKey(o1).compareTo(collator.getCollationKey(o2));
        }
    }
}

二、關鍵類解析

類/方法作用
Collator.getInstance(Locale.CHINA)獲取中文環境的比較器,內部封裝拼音/筆畫規則
RuleBasedCollator基於規則的比較器,可獲取 CollationKey 提升重複比較性能
CollationKey預計算的排序鍵,compareTo 比字符串直接比較快得多
TreeMap(Comparator)構造時注入比較器,所有 Key 插入自動按規則排序

三、進階:按筆畫/部首排序

若需按筆畫排序,可自定義規則字符串構建 RuleBasedCollator:

// 簡體中文筆畫排序規則(示例,完整規則極其複雜)
String rules = "< 一 < 乙 < 丶 < 丿 < 乀 < 乁 ...";  // 省略完整規則
RuleBasedCollator strokeCollator = new RuleBasedCollator(rules);
實際建議:手寫筆畫規則極易出錯且維護成本高。生產環境推薦使用 ICU4J 庫(com.ibm.icu.text.Collator),提供成熟的中文拼音/筆畫/部首多種排序模式,且持續更新 Unicode 標準。

四、其他 Map 排序場景對比

場景方案複雜度適用性
Key 自然順序(數字/字母)new TreeMap()O(1)默認即可
Key 自定義對象排序new TreeMap(Comparator)O(1)實現 Comparable 或傳 Comparator
Value 排序(需保留 Key)轉 List<Entry> → sort → LinkedHashMapO(n log n)一次性排序輸出
中文 Key 排序TreeMap + RuleBasedCollatorO(1) 插入本文方案
頻繁讀寫 + 排序ConcurrentSkipListMapO(log n)高併發場景

五、完整可運行測試類

import java.text.Collator;
import java.text.RuleBasedCollator;
import java.util.*;

public class MapSortTest {
    public static void main(String[] args) {
        // 1. TreeMap + 中文比較器
        Map map = new TreeMap<>(new ChineseComparator());
        map.put("趙", 1); map.put("錢", 2); map.put("孫", 3); map.put("李", 4);
        System.out.println("中文拼音序:" + map.keySet());  // [李, 錢, 孫, 趙]

        // 2. Value 排序轉 LinkedHashMap
        Map score = new HashMap<>();
        score.put("張三", 85); score.put("李四", 92); score.put("王五", 78);
        Map sortedByValue = score.entrySet().stream()
            .sorted(Map.Entry.comparingByValue().reversed())
            .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll);
        System.out.println("分數降序:" + sortedByValue);  // {李四=92, 張三=85, 王五=78}
    }

    static class ChineseComparator implements Comparator {
        private final RuleBasedCollator collator = (RuleBasedCollator) Collator.getInstance(Locale.CHINA);
        public int compare(String o1, String o2) {
            if (o1 == null || o2 == null) return 0;
            return collator.getCollationKey(o1).compareTo(collator.getCollationKey(o2));
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved