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

Java 中英混合字串陣列按首字母排序實作:拼音轉換與 Collator 進階應用

     編輯:Java 相關知識

中英混排字串自然排序完整解決方案

Java 預設 Arrays.sort() 配合 Collator 僅支援「數字→英文→中文」分組排序,無法實現「首字母相同者相鄰」的通訊錄/音樂列表自然排序。本文提供拼音首字母標記法完美解決此問題。

問題場景與預設行為

String[] arrays = {"gyu", "sdf", "zf", "大同", "收到", "处所", "三等分", "的人", "否决高铁", "泛代数", "上的投入", "和国家"};

Comparator comp = Collator.getInstance(Locale.CHINA);
Arrays.sort(arrays, comp);
// 結果: gyu sdf zf 大同 的人 处所 否决高铁 泛代数 和国家 三等分 上的投入 收到
// 英文優先,中文按拼音分組但與英文分離

核心解法:拼音首字母前綴標記法

思路:中文字串加上「拼音首字母+分隔符」前綴 → 自然排序 → 移除前綴

import net.sourceforge.pinyin4j.*;
import net.sourceforge.pinyin4j.format.*;

public class MixedStringSorter {
    public static void main(String[] args) {
        String[] arrays = {"gyu", "sdf", "zf", "大同", "收到", "处所", "三等分", "的人", 
                          "否决高铁", "泛代数", "上的投入", "和国家"};
        
        // 1. 中文字串加上拼音首字母標記
        for (int i = 0; i < arrays.length; i++) {
            String str = arrays[i];
            if (str.isEmpty()) continue;
            String firstChar = str.substring(0, 1);
            
            // 判斷是否為中文 (Unicode 範圍)
            if (firstChar.matches("[\\u4e00-\\u9fa5]+")) {
                String pinyinInitial = getPinyinInitial(str);
                arrays[i] = pinyinInitial + "&" + str; // 標記: "d&大同"
            }
        }
        
        // 2. 標準排序 (中英數統一按字元序)
        Comparator comp = Collator.getInstance(Locale.CHINA);
        Arrays.sort(arrays, comp);
        
        // 3. 移除標記還原原字串
        for (int i = 0; i < arrays.length; i++) {
            String str = arrays[i];
            if (str.contains("&") && str.indexOf("&") == 1) {
                arrays[i] = str.split("&")[1];
            }
            System.out.println(arrays[i]);
        }
    }
    
    // 取得漢字拼音首字母 (需 pinyin4j-2.5.0.jar)
    public static String getPinyinInitial(String str) {
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        
        try {
            String[] pinyinArr = PinyinHelper.toHanyuPinyinStringArray(str.charAt(0), format);
            return pinyinArr[0].substring(0, 1); // 首字母
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            return "#"; // 無法轉換字符
        }
    }
}

執行結果

大同 (d)
的人 (d)
处所 (c)
否决高铁 (f)
泛代数 (f)
gyu (g)
和国家 (h)
三等分 (s)
上的投入 (s)
收到 (s)
sdf (s)
zf (z)
// 實現: 拼音首字母相同者相鄰,中英自然融合

關鍵技術點解析

技術點說明
中文判斷matches("[\\u4e00-\\u9fa5]+") 涵蓋基本漢字區
分隔符選擇& ASCII 碼 38,小於字母數字,確保標記優先排序
索引檢查indexOf("&") == 1 確認首字母長度為 1,避免誤處理原含 & 的字串
pinyin4j 依賴Maven: com.belerweb:pinyin4j:2.5.0
多音字處理取第一個拼音方案,生產環境需結合詞庫消歧

進階優化方向

  • 完整拼音排序:首字母相同時比較完整拼音 (需緩存拼音避免重複計算)
  • 效能優化:預計算拼音鍵值對,避免排序過程重複轉換
  • 國際化擴展:ICU4J Transliterator 支援日文羅馬音、韓文羅馬字等
  • TreeMap 索引:大量資料建立 TreeMap> 索引

此標記法巧妙利用現有排序演算法,零成本實現中英混排自然排序,適合通訊錄、音樂列表、選單等場景。

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