對中文資料進行排序時,預設的 Unicode 碼值順序(如「喬峰」在「郭靖」前)往往不符合使用者預期。Java 提供 java.text.Collator 配合 Locale.CHINA,可依據拼音、筆畫或部首邏輯正確排序。本文示範如何用 Arrays.sort(T[], Comparator) 實現中文首字母排序,並解析底層原理。
getInstance(Locale) 取得特定地區的比較器。import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;
public class ChineseSortDemo {
public static void main(String[] args) {
// 1. 取得中文比較器
Comparator comparator = Collator.getInstance(Locale.CHINA);
// 2. 準備資料
String[] names = { "喬峰", "郭靖", "楊過", "張無忌", "韋小寶" };
// 3. 排序(原地修改陣列)
Arrays.sort(names, comparator);
// 4. 輸出結果
for (String n : names) {
System.out.println(n);
}
}
}
郭靖 (Guo)
喬峰 (Qiao)
韋小寶 (Wei)
楊過 (Yang)
張無忌 (Zhang)
依拼音首字母 G → Q → W → Y → Z 正確排序,而非 Unicode 碼值順序。
Collator 提供 setStrength(int) 控制比較嚴格度:
PRIMARY:僅比較基本字母(忽略聲調、大小寫)。SECONDARY:比較字母+重音/聲調(忽略大小寫)。TERTIARY(預設):字母+聲調+大小寫/全半形皆比較。IDENTICAL:全碼位比較,等同 equals()。Collator col = Collator.getInstance(Locale.CHINA);
col.setStrength(Collator.PRIMARY); // 忽略聲調,只按拼音字母排
Collator.getInstance() 取決於 JVM 預設語系,跨伺服器部署易產生不一致。Collator 比較較慢,大量資料(>10 萬筆)建議預先轉拼音鍵值排序,或使用 ICU4J 的 RuleBasedCollator 快取排序鍵。null 會拋 NPE,排序前先過濾或實作 nullsFirst/Last 包裝比較器。Locale.TAIWAN 或 Locale.HONG_KONG,排序規則會依注音/筆畫調整。Java 內建 Collator + Locale.CHINA 是實現中文自然排序的標準解法,零依賴、程式碼極簡。記住「指定 Locale、注意強度、大量資料預轉鍵」三原則,即可在任何中文專案中穩健落地。