中文拼音排序的两种方法

最近遇到了中文排序的需求,所谓中文排序,一般都是说按中文对应的拼音字母排序,经过网上查询了解,总结一下,有下面两种方式,一一介绍下:

数据库中排序

能在数据库中解决的问题,自然放到数据库中解决,尤其排序一般和分页一起出现,如果能在数据库层面做掉,从查询性能和代码的简洁性上讲都是最好的,那么如何在数据库层面对中文进行排序呢?

其实,文字的排序,就是按代表文字的,背后的编码排序,UTF-8下,中文并不是严格按照其对应拼音的顺序编码的,导致UTF-8下直接按中文字段做排序,效果不好,那就换个对中文支持好的编码呗。是的,换成GBK或者GB2312即可。具体sql如下:
select * from tableA order by CONVERT(col using gbk)
将中文字段列按GBK临时编码后排序。

另外需要补充的是,mysql似乎不支持对中文按笔画排序,其他数据库却有支持。

代码层面排序

如果数据库恰好不支持CONVERT函数的话,或者不想在数据库层面排序的话,那就需要在代码层面做排序了,我用Java,Java做排序,自然是要实现一个Comparator的类,内部有一个排序的规则。这里如何做排序呢?

这就要提到一个第三方库了:pinyin4j,在汉字和拼音转化上,很少能绕开这个库。

我们的思路是,将汉字先通过pinyin4j,转化成全是拼音的字符串,然后对字符串进行一般意义上的排序。

示例代码如下:

//PinyinObject 一个假想的需要中文排序的对象,有待排序字段pinyinCol
public class PinyinCompartor<PinyinObject> implements Comparator<T>{

    private static HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
    static{
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
    }

    @Override
    public int compare(PinyinObject o1,PinyinObject o2){
        try{
            String pinyin1 = PinyinHelper.toHanyuPinyinString(o1.getPinyinCol(),format,"",false);
            String pinyin2 = PinyinHelper.toHanyuPinyinString(o2.getPinyinCol(),format,"",false);
            return pinyin1.compareTo(pinyin2);
        }catch(Exception e){
            throw new PinyinException(e);
        }
    }
}

附带一篇搜到的很全的Java排序的方法,包含拼音和笔画
中文排序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值