基于pinyin4j实现中文按照首字母排序

该博客介绍了如何使用Pinyin4j库和Java的Collator进行中文字符串按拼音首字母排序,包括数字和特殊字符的处理。示例代码提供了一个PinyinComparator类,实现了比较器接口,用于对包含中文、数字和特殊字符的字符串数组进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:
https://www.cnblogs.com/zhangqie/p/9456401.html
https://blog.youkuaiyun.com/weixin_42311000/article/details/114711578

结合以上的2个帖子进行了改进,得到的结果如下:
(1)依赖的jar:

<dependency>
	<groupId>com.belerweb</groupId>
	<artifactId>pinyin4j</artifactId>
	<version>2.5.1</version>
</dependency>

(2)测试demo代码如下:

import net.sourceforge.pinyin4j.PinyinHelper;
import org.springblade.core.tool.utils.Func;

import java.text.CollationKey;
import java.text.Collator;
import java.util.*;

public class PinyinComparator implements Comparator<String> {
    Collator collator = Collator.getInstance(Locale.CHINA);

    public int compare(String o1, String o2) {
        CollationKey key1 = collator.getCollationKey(chineseToPinyin(o1));
        CollationKey key2 = collator.getCollationKey(chineseToPinyin(o2));
        return key1.compareTo(key2);
    }

    private static String chineseToPinyin(String chinese) {
        char[] chars = chinese.toCharArray();
        StringBuffer pinyinSbf = new StringBuffer();
        for (char ch:chars){
            String[] strings = PinyinHelper.toHanyuPinyinStringArray(ch);
            if (Func.isNotEmpty(strings)){
                //中文返回的是拼音
                pinyinSbf.append(strings[0].substring(0,strings[0].length()-1));
            }else{
                //为null的字符为数字、字母或者其他特殊符号
                pinyinSbf.append(ch);
            }
        }
        return pinyinSbf.toString();
    }

    public static void main(String[] args) {
        String[] arr = {"关羽2", "关羽1", "张飞", "公孙瓒", "诸葛亮", "曹操", "刘备", "赵云", "微微", "哈哈", "哈", "怡情", "用友", "医院", "小米", "张三", "李四", "王五", "赵六", "JAVA", "java", "AVA", "php", "PHP", "123", "2", "234", "126", "011", "123", "$%$#", "哈哈A",
                "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情"};
        List<String> list = Arrays.asList(arr);
        Collections.sort(list, new PinyinComparator());
        for (String str: list) {
            System.out.println(str);
        }
    }
}

(3)输入结果:

$%$#
011
123
123
126
1哈哈a
1哈哈A
1哈哈b
2
234
AVA
曹操
公孙瓒
关羽1
关羽2
哈
哈
哈哈
哈哈
哈哈A
java
JAVA
李四
刘备
php
PHP
王五
微微
小米
怡情
怡情
医院
用友
张飞
张三
赵六
赵云
诸葛亮

(4)结论:
特殊字符>数字>小写字母>大写字母

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行云的逆袭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值