最近做一个手机数据同步的应用开发,需要提供地址簿信息按照姓名的拼音次序进行排序。但仔细考察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. asp.net 生成PDF方法

    今天转博客园看到有人发表了一篇生成PFd的文章,准备自己也留一份准备以后用到的时候方便调用: 首先去itextsharp网站下载控件(https://sourceforge.net/projects/ ...

  2. DRP PK 牛腩新闻发布系统

    一.JSP与ASP (1)Web服务器的支持:大多数通用的Web服务器如:Apache.Netscape和Microsoft IIS都支持JSP页面,只有微软本身的Microsoft IIS和Pers ...

  3. TAG的用法和用途[转]

    用一个例子来说明:一个combobox控件...一个textBox控件...一个datagridview控件!datagridview控件是连接数据库的...combobox和textBox是联合查询 ...

  4. iOS多线程编程Part 2/3 - NSOperation

    多线程编程Part 1介绍了NSThread以及NSRunLoop,这篇Blog介绍另一种并发编程技术:NSOPeration. NSOperation & NSOperationQueue ...

  5. c#之反射总结

     1.了解什么事程序集 2.加载程序集 首先要加载需要加载的程序集,然后找到指定的类型,进而往下进行动态加载. 要加载的程序集中的内容: public class Class1:Person { pr ...

  6. Notes of the scrum meeting(2013/10/23)

    ps:本来是10月23号周三下午开的会,这几天由于各种事情忙,忘记写博客了,现在补上. 软工项目组buaa_smile开始项目第一次scrum meeting meeting time:4:00~5: ...

  7. JAVASCRIPT、ANDROID、C#分别实现普通日期转换多少小时前、多少分钟前、多少秒

    貌似最近很流行这个,就写了个js函数实现之 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ...

  8. MySQL中的配置参数interactive_timeout和wait_timeout(可能导致过多sleep进程的两个参数)

    1)interactive_timeout:参数含义:服务器关闭交互式连接前等待活动的秒数.交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的 ...

  9. 提升SQL Server速度整理索引碎片

    转载:http://wenku.baidu.com/view/f64c8a707fd5360cba1adbea.html SQL Server2005索引碎片分析和解决方法   毫无疑问,给表添加索引 ...

  10. Winform 窗体的操作

    原文:http://www.cnblogs.com/Billy-rao/archive/2012/05/16/2503437.html 怎样能使winform窗体的大小固定住,不能调整其大小 窗体Fo ...