java 汉字按拼音排序_Java当中汉字按照拼音排序

开发中碰到个小需求:需要对省按拼音排序。其实全国的省个数并不多,实在不行人肉排序也OK,不过这样就太挫了。

网上查了下,发现原生JDK自带的解决方法如下:

package com.taobao.test;

import java.text.Collator;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Comparator;

import java.util.Iterator;

import java.util.Map;

public class TestSortChinese {

public static void main(String[] args){

Iterator it = SortChinese.provinceMap.entrySet().iterator();//这里的map里数据是全国所有的省中文String

ArrayList al = new ArrayList();

while(it.hasNext()){

al.add((String)((Map.Entry)(it.next())).getValue());

}

Object[] arr = al.toArray();

Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);

Arrays.sort(arr, cmp);

for(Object s : arr){

System.out.println(s);

}

}

}

打印出来的结果还行,除了重庆因为多音字的原因,被当成了zhong庆排在了末尾,其它的都对了。对于这个特殊情况就单独处理下好了。

这个JDK自带的方法这么好用吗?查证了下发现是有缺陷的,其只能对于GB2312里的中文字符进行正确排序,通俗点说就是只能对常用字好用。但是这个常用字的定义也不能让人很满意,只支持6000多个常用字,这是远远不够的。GBK是GB2312的超集,里面包含了20000多个中文字符(基本就包括所有中文字符了),但是不包含在GB2312里的字符都无法正确排序了。

网上普遍的解决方案是用到一个开源项目:http://pinyin4j.sourceforge.net/。具体可见下面这四篇文章,里面叙述的都比较详细了:

http://www.blogjava.net/spinage/archive/2009/10/15/298403.html

http://hi.baidu.com/chssheng2007/item/1bf3a6dedea5eff492a974fb

http://blog.csdn.net/kennylee26/article/details/3926168

http://blog.csdn.net/machozhao/article/details/1047333

由于此次只用到了点皮毛,所以没有深入的去钻研,但正如参考文章里写到的,实现的原理就是把汉字转化为拼音,然后再进行的排序。有兴趣的读者可以深挖下怎么把汉字转化为拼音。我看到有文章介绍说可以用到系统里的字库的,但未进行实践尝试,暂先不过多叙述了。

  • 0
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

苏南影

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值