TreeMap 默認按 Key 自然順序排序(數字/字母),但中文 Key 需按拼音或筆畫排序時,必須提供自定義 Comparator。本文提供基於 RuleBasedCollator 的完整實現,支援中文本地化排序規則。
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 → LinkedHashMap O(n log n) 一次性排序輸出 中文 Key 排序 TreeMap + RuleBasedCollator O(1) 插入 本文方案 頻繁讀寫 + 排序 ConcurrentSkipListMap O(log n) 高併發場景 五、完整可運行測試類
import java.text.Collator; import java.text.RuleBasedCollator; import java.util.*; public class MapSortTest { public static void main(String[] args) { // 1. TreeMap + 中文比較器 Mapmap = 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)); } } }