Java中ArrayList默认不支持中文拼音排序,需用Collator.getInstance(Locale.CHINA)实现按拼音自然排序,或引入pinyin4j库提取首字母后自定义比较器精准控制分组;注意多音字、混合字符处理及性能优化。

Java 中的 ArrayList 本身不支持中文拼音排序,需要借助 java.text.Collator 或第三方库(如 pinyin4j)实现按拼音首字母排序。核心思路是:将中文字符串转换为对应的拼音(或首字母),再基于拼音进行比较。
使用 Collator 实现简单拼音排序(推荐基础场景)
Collator 是 Java 自带的国际化排序工具,对中文支持较好,能按 Unicode 排序规则自动处理拼音顺序,无需额外依赖。
- 适用于 JDK 7+,直接使用
Collator.getInstance(Locale.CHINA) - 它默认按完整拼音排序(非仅首字母),但结果天然满足“首字母分组”的逻辑(比如“北京”“斑马”“成都”会按 B、B、C 排)
- 若只要首字母分组效果(不严格要求字典序),可配合
stream().sorted()或Collections.sort()
示例代码:
import java.text.Collator;
import java.util.*;
List<String> list = new ArrayList<>(Arrays.asList("武汉", "北京", "广州", "上海", "成都"));
Collator collator = Collator.getInstance(Locale.CHINA);
list.sort(collator);
// 输出:["北京", "成都", "广州", "上海", "武汉"]
System.out.println(list);
提取首字母后排序(精准控制首字母)
如果明确要求只按「汉字拼音首字母」排序(例如所有“张”“赵”“周”都归为 Z 组,并排在一起),需先获取每个字符串首字符的拼音首字母,再自定义比较器。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 需引入
pinyin4j库(Maven 坐标:net.sourceforge.pinyin4j:pinyin4j:2.5.1) - 用
PinyinHelper.toHanyuPinyinStringArray(ch)[0].charAt(0)获取首字首字母(大写) - 非汉字字符(如数字、英文、空格)可统一归到末尾或按原样处理
示例逻辑:
import net.sourceforge.pinyin4j.PinyinHelper;
list.sort((s1, s2) -> {
char c1 = getFirstLetter(s1);
char c2 = getFirstLetter(s2);
return Character.compare(c1, c2);
});
static char getFirstLetter(String str) {
if (str == null || str.isEmpty()) return ' ';
char first = str.charAt(0);
if (first >= 'A' && first <= 'z') return Character.toUpperCase(first);
String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(first);
if (pinyin != null && pinyin.length > 0) {
return Character.toUpperCase(pinyin[0].charAt(0));
}
return '#'; // 无法转换时的占位符
}
注意事项与常见问题
-
多音字未处理:pinyin4j 默认返回常用读音,如“重庆”的“重”取
chong而非zhong;如需人工干预,得加映射表 - 混合内容排序:含英文、数字、符号的字符串,建议先清洗或定义优先级(如字母 > 数字 > 符号)
-
性能考虑:大量数据排序时,避免在 compare 方法中重复调用
toHanyuPinyinStringArray;可预计算并缓存首字母 -
Locale 设置:用
Collator.getInstance(Locale.CHINA),别用US或默认,否则中文可能乱序
替代方案:用 TreeMap 按首字母分组
如果目标不是排序而是「按首字母归类」,可用 TreeMap<Character, List<String>> 分组:
- 遍历列表,对每个字符串提取首字母(同上)
- 以该字母为 key,把字符串加入对应 list
- TreeMap 天然按键(字母)升序,得到 A-Z 分组结果
适合做通讯录、索引栏等 UI 场景,而非单纯排序需求。

















