zoukankan      html  css  js  c++  java
  • Java 中文拼音 排序

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

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

  • 相关阅读:
    [UGUI]事件机制
    [C#]CompareTo
    [Unity算法]交换排序(二):快速排序
    [Unity算法]交换排序(一):冒泡排序
    [Lua]string(二):string.sub处理中文
    [Lua]string(一):string库
    [Unity热更新]LuaFramework14.打包、加载和卸载策略
    [Unity热更新]LuaFramework13.事件派发
    数仓day01
    大数据学习day39----数据仓库02------1. log4j 2. 父子maven工程(子spring项目的创建)3.项目开发(埋点日志预处理-json数据解析、清洗过滤、数据集成实现、uid回补)
  • 原文地址:https://www.cnblogs.com/sode/p/2209674.html
Copyright © 2011-2022 走看看