拼音排序

拼音有好几种方式,其中最主要的是中华人民共和国的汉语拼音 Chinese Phonetic。对汉字的排序有两种:一种是宽松的,能够按拼音排序最常用的汉字,另一种是严格的,能够按拼音排序绝大部分大部分汉字。

宽松的拼音排序法

原理:汉字最早是GB2312编码,收录了六千多个汉字,是按拼音排序的,编码是连续的。 后来出现了GBK编码,对GB2312进行了扩展,到了两万多汉字,并且兼容GB2312,也就是说GB2312中的汉字编码是原封不动搬到GBK中的(在GBK编码中[B0-D7]区中)。

如果我们只关心这6000多个汉字的顺序,就可以用下面的方法实现汉字宽松排序。

/**

* @author shaob

*

* Copyright (c)

*/

package chinese.utility;

import java.text.Collator;

import java.util.Comparator;

import java.util.Locale;

public class PinyinSimpleComparator implements Comparator {

public int compare(String o1, String o2) {

return Collator.getInstance(Locale.CHINESE).compare(o1, o2);

}

}

在对[孙, 孟, 宋, 尹, 廖, 张, 徐, 昆, 曹, 曾,怡]这几个汉字排序,结果是:[曹, 昆, 廖, 孟, 宋, 孙, 徐, 尹, 曾, 张, 怡]。最后一个 怡 有问题,不该排在最后的。

注意:这个程序有两个不足

由于gb2312中的汉字编码是连续的,因此新增加的汉字不可能再按照拼音顺序插入到已有的gb2312编码中,所以新增加的汉字不是按拼音顺序排的。

同音字比较的结果不等于0 。

下面的测试代码可以证明

/**

* @author shaob

*

* Copyright (c)

/**

* 非常用字(怡)

*/

@Test

public void testNoneCommon() {

Assert.assertTrue(comparator.compare("怡", "张") > 0);

}

/**

* 同音字

*/

@Test

public void testSameSound() {

Assert.assertTrue(comparator.compare("怕", "帕") != 0);

}

严格的拼音排序法

为了解决宽松的拼音的两点不足,可以通过实现汉语拼音的函数来解决。goolge下看到sf上有个pinyin4j的项目,可以解决这个问题,pinyin4j的项目地址是:http://pinyin4j.sourceforge.net/。

实现代码:

/**

* @author shaob

*

* Copyright (c)

*/

package chinese.utility;

import java.util.Comparator;

import net.sourceforge.pinyin4j.PinyinHelper;

public class PinyinComparator implements Comparator {

public int compare(String o1, String o2) {

for (int i = 0; i < o1.length() && i < o2.length(); i++) {

int codePoint1 = o1.charAt(i);

int codePoint2 = o2.charAt(i);

if (Character.isSupplementaryCodePoint(codePoint1)

|| Character.isSupplementaryCodePoint(codePoint2)) {

i++;

}

if (codePoint1 != codePoint2) {

if (Character.isSupplementaryCodePoint(codePoint1)

|| Character.isSupplementaryCodePoint(codePoint2)) {

return codePoint1 - codePoint2;

}

String pinyin1 = pinyin((char) codePoint1);

String pinyin2 = pinyin((char) codePoint2);

if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字

if (!pinyin1.equals(pinyin2)) {

return pinyin1.compareTo(pinyin2);

}

} else {

return codePoint1 - codePoint2;

}

}

}

return o1.length() - o2.length();

}

/**

* 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。

*/

private String pinyin(char c) {

String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);

if (pinyins == null) {

return null;

}

return pinyins[0];

}

}

java 拼音 排序_java对中文(拼音)进行排序相关推荐

  1. oracle 中文拼音取首字母,ORACLE依据中文拼音首字母排序、取得中文拼音首字母函数...

    当前位置:我的异常网» 数据库 » ORACLE依据中文拼音首字母排序.取得中文拼音首字母 ORACLE依据中文拼音首字母排序.取得中文拼音首字母函数 www.myexceptions.net  网友 ...

  2. java 拼音首字母_java获取中文拼音首字母的实例

    导读热词 正文 如下所示: import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinHelperUtil { /** * 得到 ...

  3. [转] JS 排序(包括按中文拼音排序) Google到的好东西,收藏!

    转自:http://blog.csdn.net/sunyujia/ test.html <html><head><title></title><s ...

  4. java 获取拼音码_Java获取汉字拼音的全拼和首拼实现代码分享

    import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java ...

  5. java 数字、英文、中文混排排序

    按照数字,字母,中文拼音首字母顺序排序 public static void main(String[] args) {List<QuotationBrandResult> quotati ...

  6. es自定义拼音分词器处理中文拼音排序问题

    1.先上结论,如下mapping可以解决es拼音排序问题 {"settings": {"number_of_shards": "3",&qu ...

  7. php 生成拼音缩写,PHP生成中文拼音

    PHP生成中文拼音 以下为引用的内容: php代码: class ChineseSpell { /** * @var array $chineseSpellList 拼音编码对应表 * @access ...

  8. java 怎么自定义排序_Java如何实现List自定义排序

    Java如何实现List自定义排序,自定义,即为,详细内容,相关文章,更多关于 Java如何实现List自定义排序 易采站长站,站长之家为您整理了Java如何实现List自定义排序的相关内容. 实体类 ...

  9. java面试排序都考哪几种排序_java算法面试题:排序都有哪几种方法?

    一.冒泡排序 [java] view plain copy package sort.bubble; import java.util.Random; /** * 依次比较相邻的两个数,将小数放在前面 ...

  10. java给xyz大小排序_java递归实现string xyz排序

    先用上面的一张图说明逻辑,这就是递归的逻辑. xy排序就相当于在x的空位插上y,x只有两个空位,y插前面得带yx,y插后面得到xy xyz排序就相当于在xy排序的所有结果插上z,结果如图 代码实现如下 ...

最新文章

  1. Linux停用“黑名单”,因为这是敏感词,涉嫌种族歧视
  2. 二叉树前序遍历-递归与非递归
  3. Dynamips 设置
  4. Oracle Database 快捷版 安装 连接
  5. matlab基本运算与函数
  6. eureka服务下线方式
  7. leetcode 564,546
  8. java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化
  9. 【渝粤教育】广东开放大学 软件工程 形成性考核 (50)
  10. 2017.9.28 降雨量 思考记录
  11. 优秀案例|想学排版?布局清晰明了的海报给你参考
  12. 大数据时代,做数据分析报告的基本流程
  13. C语言引用方式调用函数
  14. 图像处理基础与理解 随笔一 图像的内插
  15. 通过Navicat for MySQL导入数据时,日期时间错误问题解决办法
  16. 关于若依管理系统配置多数据源的原理分析
  17. google浏览器字体模糊问题(类似分辨率问题)解决办法
  18. 终于在国庆前找到工作了!(面试全过程真实记录)
  19. idea无法安装插件
  20. 职场:狼文化or羊文化

热门文章

  1. 谷歌flutter_在Flutter中使用Google Pay Through Stripe接受付款
  2. php在线拍照代码,JQ+PHP实现浏览器webcam摄像头在线定时自动拍照存储照片
  3. shopex 网店系统 v4.8.5 安装图文教
  4. 三菱PLC与欧姆龙PLC通讯
  5. 泰坦尼克号预测结果分析报告
  6. 在虚拟机centos7中使用docker安装nginx后,本地浏览器无法访问?
  7. 待业在家的6个月,我靠淘宝月入百万:你看不起的行业,往往很赚钱
  8. tracert命令详解
  9. 四川大学计算机学院优秀毕业论文,(完整版)四川大学本科_毕业论文(设计)_有关规定...
  10. 平稳性的检验 java_[时间序列分析]--平稳性,白噪声的检验