最近做一个手机数据同步的应用开发,需要提供地址簿信息按照姓名的拼音次序进行排序。但仔细考察Java提供的Collator之后,发现其中文拼音排序存在严重的问题。
Java提供Collator来支持不同语言的排序问题, 使用方法如下:
Comparator cmp = (Collator.getInstance(Locale.China));
cmp,compareTo("爱国", '中国') < 0;
   如果所要比较的中文字符串属于GB一级字库,比较结果正确。但当字符是二级增补字库和GB18030新增的汉字时,无法获得正确的比较结果。例如:朱镕基的“镕rong”字,姜喆的“喆zhe”字。举例来说,下面的测试使用Java提供的Comparator时失败!
assertTrue(cmp.compareTo("镕", "赵"));
实际测试结果“镕rong”大于“赵zhao”。无法满足应用开发需求!

为了彻底解决上述问题,从拼音输入法的编码表入手,彻底实现中文的拼音排序问题。基本实现思想如下:
1. 利用Windows XP提供的WinPY输入法,提取文本格式的汉字和拼音的对照表
2. 将拼音对照表读入后,使用XML Encode方式进行Serialization, 并存放在Classpath中,共运行Java程序时装载.
3. 实现Comparator接口,在比较每对中文字符串时,先将其转换为中文的拼音字符串。然后再进行比较,确保获得正确的结果.
4. 提供ChineseHelper接口及实现类,提供中文字符串基于拼音模式的startWith(char first)方法, 为中文地址簿按照拼音首字母排序提供支持。
注意:由于中文存在多音字,因此首字判断提供对多音字的支持。例如: "重".startWith('c')和"重".startWith('z')均返回true.

使用方法:
1.源程序和Class均压缩在附录部分所提供的Jar包中.
2.直接将Jar包加入到Classpath中即可使用
3.由于最近热衷使用JDK 1.5的Generic Type, 因此本软件运行时需要JDK 1.5
4.比较中文字符串:
Comparator<Object> comparator = new ChinesePYComparator();
comparator.compare("镕基", "中国")

5. 判断中文拼音的首字符:
    ChineseHelper helper = new ChinesePYComparator();
      assertTrue(helper.startWith("重庆", 'c', true));
      assertTrue(helper.startWith("重庆", 'z', true));

6. 详细使用方法可以参见源程序:
com.npower.text.TestChineseHelper, com.npower.text.TestChinesePYComparator, com.npower.text.TestChinesePYConvertor
上述三个类提供基于Junit的测试用例.

下载源程序和二进制Jar包(chinesepy.jar).注意源程序和class均在chinesepy.jar中。

Java中中文拼音的排序问题的更多相关文章

  1. Java中中文排序器

    在Java中使用Collator类按照汉字拼音排序字符串 public static void main(String[] args) throws Exception{ String[] strs ...

  2. 浅谈在java中list集合的排序问题

    定义实体类: public class Person { private Integer id; private String name; private Integer age; public In ...

  3. Java获取中文拼音、中文首字母缩写和中文首字母

    获取中文拼音(如:广东省 -->guangdongsheng) /** * 得到中文全拼 * @param src 需要转化的中文字符串 * @return */ public static S ...

  4. java获取中文拼音首字母

    import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinHelperUtil { /** * 得到中文首字母(中国 -> ...

  5. java获取中文汉字的所有拼音

    java获取中文汉字的所有拼音   中文汉字可能有很多读音,java中分别用1,2,3,4来区别,例如“作”字,就有三个读音,zuo1,zuo2,zuo4. java获取汉字读音拼音代码如下所示: S ...

  6. java中汉字自动转换成拼音

    java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...

  7. 关于JAVA中URL传递中文参数的问题

    今天在调用一个接口时,需要传递一个中文参数,结果获取不到数据,原因就在于中文传参的编码问题. 问题来源:URL url= new URL("http://XXX?OrganName=司法厅& ...

  8. Java中url传递中文参数取值乱码的解决方法

    java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...

  9. java中可以出现的中文乱码的集中解决

    从学习javaweb开始就会经常遇到中文乱码,今天就做以下记录: 1. 要避免项目中遇到乱码,首先就是在搭建项目的设置工作空间的字符编码,若是多人开发,就更应该做到统一,在eclipse中选择widn ...

随机推荐

  1. apache+tomcat整合

    一 .Apache与Tomcat的比较 apache支持静态页面,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是 ...

  2. Word 使用技巧

    文档的写作,例来分为latex与word两大阵营.一个是论文界的宠儿,一个是平民的所见即所得.看起来好像前者更加牛一些. 本来我也是觉得latex比word好.但是使用latex时苦于找不到一个好的编 ...

  3. cadence PCB绘制步骤

    1 创建一个PCB文件  file -> new 2 创建一个板框  add -> line ,在 options 选型中选择好,板框为 长 4400mil 宽 3200 3 给PCB板框 ...

  4. JDBC ----常用数据库的驱动程序及JDBC URL:

    常用数据库的驱动程序及JDBC URL: Oracle数据库: 驱动程序包名:ojdbc14.jar  驱动类的名字:oracle.jdbc.driver.OracleDriver  JDBC URL ...

  5. 常用汉字的Unicode码表

    \u96d5\u864e\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u77 ...

  6. 【POJ】【2068】Nim

    博弈论/DP 这是Nim?这不是巴什博奕的变形吗…… 我也不会捉啊,不过一看最多只有20个人,每人最多拿16个石子,总共只有8196-1个石子,范围好像挺小的,嗯目测暴力可做. so,记忆化搜索直接水 ...

  7. 【BZOJ】【1013】【JSOI2008】球形空间产生器sphere

    高斯消元 高斯消元模板题 /************************************************************** Problem: 1013 User: Tun ...

  8. js冒泡事件的特例toggle无法实现阻止冒泡——slideDown()和slideUp()

    一.问题 题目及答案展示:要求,点击题目,展开答案.如下: 展开前 展开后 最开始使用的toggle方法来实现 $(".content_problem").toggle( func ...

  9. uva 10651

    DP  主要是位运算的运用  因为只有12位 用一个数字代表一种装态 记忆化搜索 节约时间 /***************************************************** ...

  10. hdu 4324 Triangle LOVE(拓扑排序,基础)

    题目 /***************************参考自****************************/ http://www.cnblogs.com/newpanderking ...