Java 預設 Arrays.sort() 配合 Collator 僅支援「數字→英文→中文」分組排序,無法實現「首字母相同者相鄰」的通訊錄/音樂列表自然排序。本文提供拼音首字母標記法完美解決此問題。
String[] arrays = {"gyu", "sdf", "zf", "大同", "收到", "处所", "三等分", "的人", "否决高铁", "泛代数", "上的投入", "和国家"};
Comparator
思路:中文字串加上「拼音首字母+分隔符」前綴 → 自然排序 → 移除前綴
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
大同 (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 |
| 多音字處理 | 取第一個拼音方案,生產環境需結合詞庫消歧 |
Transliterator 支援日文羅馬音、韓文羅馬字等TreeMap> 索引此標記法巧妙利用現有排序演算法,零成本實現中英混排自然排序,適合通訊錄、音樂列表、選單等場景。