Java 預設 Arrays.sort() 配合 Collator.getInstance(Locale.CHINA) 排序規則為:數字 → 英文 → 漢字。但在通訊錄、音樂列表等場景,期望 英文首字母與漢字拼音首字母合併排序(如 "Apple" 與 "安卓" 同歸 A 區)。
[\u4e00-\u9fa5])首字母& 作為排序鍵,例如 "a&安卓"import java.util.*;
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);
if (firstChar.matches("[\\u4e00-\\u9fa5]+")) {
String initial = getPinyinInitial(str);
arrays[i] = initial + "&" + str; // 如 "d&大同"
}
}
// 步驟 2:設定中文語系環境並排序
Comparator
大同
的人
中央
支持高鐵
泛代數
gyu
和國度
三等分
上的投入
收到
sdf
zf
達到「拼音首字母與英文首字母混排」效果:d(大同) → r(的人) → z(中央) → z(支持) → f(泛) → g(gyu) → h(和) → s(三) → s(上) → s(收) → s(sdf) → z(zf)。
com.belerweb:pinyin4j:2.5.0java.text.Normalizer 配合 Unicode 區段判斷 (較複雜)。com.ibm.icu.text.Transliterator.getInstance("Han-Latin") 可轉換整串拼音,功能更強大。利用「拼音首字母前綴 + JDK 原生排序 + 後處理移除」的巧妙組合,避免了自寫複雜比較器的風險,以最少代碼實現中英混合首字母合併排序,是實務中極具性價比的解法。