Java中中文拼音的排序问题
最近做一个手机数据同步的应用开发,需要提供地址簿信息按照姓名的拼音次序进行排序。但仔细考察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中中文拼音的排序问题的更多相关文章
- Java中中文排序器
在Java中使用Collator类按照汉字拼音排序字符串 public static void main(String[] args) throws Exception{ String[] strs ...
- 浅谈在java中list集合的排序问题
定义实体类: public class Person { private Integer id; private String name; private Integer age; public In ...
- Java获取中文拼音、中文首字母缩写和中文首字母
获取中文拼音(如:广东省 -->guangdongsheng) /** * 得到中文全拼 * @param src 需要转化的中文字符串 * @return */ public static S ...
- java获取中文拼音首字母
import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinHelperUtil { /** * 得到中文首字母(中国 -> ...
- java获取中文汉字的所有拼音
java获取中文汉字的所有拼音 中文汉字可能有很多读音,java中分别用1,2,3,4来区别,例如“作”字,就有三个读音,zuo1,zuo2,zuo4. java获取汉字读音拼音代码如下所示: S ...
- java中汉字自动转换成拼音
java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...
- 关于JAVA中URL传递中文参数的问题
今天在调用一个接口时,需要传递一个中文参数,结果获取不到数据,原因就在于中文传参的编码问题. 问题来源:URL url= new URL("http://XXX?OrganName=司法厅& ...
- Java中url传递中文参数取值乱码的解决方法
java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...
- java中可以出现的中文乱码的集中解决
从学习javaweb开始就会经常遇到中文乱码,今天就做以下记录: 1. 要避免项目中遇到乱码,首先就是在搭建项目的设置工作空间的字符编码,若是多人开发,就更应该做到统一,在eclipse中选择widn ...
随机推荐
- Oracle表空间、段、区和块
数据块(Block) 数据块Block是Oracle存储数据信息的最小单位.注意,这里说的是Oracle环境下的最小单位.Oracle也就是通过数据块来屏蔽不同操作系统存储结构的差异.无论是Windo ...
- 【F#】核心数据多线程处理的首选
http://www.cnblogs.com/zilin-xiao/archive/2011/08/26/2155124.html
- WebAPi(selfhost)
ASP.NET WebAPi(selfhost)之文件同步或异步上传 前言 前面我们讲过利用AngularJs上传到WebAPi中进行处理,同时我们在MVC系列中讲过文件上传,本文结合MVC+We ...
- JDBC增删改查
/* db.properties的配置 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/day14 username=root ...
- VBS基础篇 - class
Class 语句:声明一个类的名称,以及组成该类的变量.属性和方法的定义. Class name '参数name必选项,Class 的名称 statements '一个或多个语句,定义了 Class ...
- 对cnblogs.com用户体验的评价
一.对于cnblogs.com的用户体验我们先对以下问题进行回答: 1.你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我们是正在学习软件工程课程的在校计算机专业大学生,在博 ...
- WPF 多线程处理(3)
WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) 首先我们需要几个属性来保存取得的数据,因为在 ...
- 微信诡异的 40029 不合法的oauth_code
最近几天在做微信公共平台开发,之前一切正常运行着,发布一套程序出去之后,发现时不时的报错! 小总结下问题出现原因:微信oauth2.0 接口说明 第一步:用户同意授权,获取code 在确保微信公众账号 ...
- asp.net中的mysql传参数MySqlParameter
注意在asp.net中传参 string sql="select name,id from user where id=@id"; //@idm不需要引号 MySqlParamet ...
- 下拉刷新ListView实现原理
(1)主要是onScroll()方法和onTouchEvent()方法,先是onTouchEvent()的ACTION_DOWN,然后是 ACTION_MOVE和onScroll()方法同时进行,最后 ...