java 拼音 排序_java对中文(拼音)进行排序
拼音排序
拼音有好几种方式,其中最主要的是中华人民共和国的汉语拼音 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对中文(拼音)进行排序相关推荐
- oracle 中文拼音取首字母,ORACLE依据中文拼音首字母排序、取得中文拼音首字母函数...
当前位置:我的异常网» 数据库 » ORACLE依据中文拼音首字母排序.取得中文拼音首字母 ORACLE依据中文拼音首字母排序.取得中文拼音首字母函数 www.myexceptions.net 网友 ...
- java 拼音首字母_java获取中文拼音首字母的实例
导读热词 正文 如下所示: import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinHelperUtil { /** * 得到 ...
- [转] JS 排序(包括按中文拼音排序) Google到的好东西,收藏!
转自:http://blog.csdn.net/sunyujia/ test.html <html><head><title></title><s ...
- java 获取拼音码_Java获取汉字拼音的全拼和首拼实现代码分享
import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java ...
- java 数字、英文、中文混排排序
按照数字,字母,中文拼音首字母顺序排序 public static void main(String[] args) {List<QuotationBrandResult> quotati ...
- es自定义拼音分词器处理中文拼音排序问题
1.先上结论,如下mapping可以解决es拼音排序问题 {"settings": {"number_of_shards": "3",&qu ...
- php 生成拼音缩写,PHP生成中文拼音
PHP生成中文拼音 以下为引用的内容: php代码: class ChineseSpell { /** * @var array $chineseSpellList 拼音编码对应表 * @access ...
- java 怎么自定义排序_Java如何实现List自定义排序
Java如何实现List自定义排序,自定义,即为,详细内容,相关文章,更多关于 Java如何实现List自定义排序 易采站长站,站长之家为您整理了Java如何实现List自定义排序的相关内容. 实体类 ...
- java面试排序都考哪几种排序_java算法面试题:排序都有哪几种方法?
一.冒泡排序 [java] view plain copy package sort.bubble; import java.util.Random; /** * 依次比较相邻的两个数,将小数放在前面 ...
- java给xyz大小排序_java递归实现string xyz排序
先用上面的一张图说明逻辑,这就是递归的逻辑. xy排序就相当于在x的空位插上y,x只有两个空位,y插前面得带yx,y插后面得到xy xyz排序就相当于在xy排序的所有结果插上z,结果如图 代码实现如下 ...
最新文章
- Linux停用“黑名单”,因为这是敏感词,涉嫌种族歧视
- 二叉树前序遍历-递归与非递归
- Dynamips 设置
- Oracle Database 快捷版 安装 连接
- matlab基本运算与函数
- eureka服务下线方式
- leetcode 564,546
- java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化
- 【渝粤教育】广东开放大学 软件工程 形成性考核 (50)
- 2017.9.28 降雨量 思考记录
- 优秀案例|想学排版?布局清晰明了的海报给你参考
- 大数据时代,做数据分析报告的基本流程
- C语言引用方式调用函数
- 图像处理基础与理解 随笔一 图像的内插
- 通过Navicat for MySQL导入数据时,日期时间错误问题解决办法
- 关于若依管理系统配置多数据源的原理分析
- google浏览器字体模糊问题(类似分辨率问题)解决办法
- 终于在国庆前找到工作了!(面试全过程真实记录)
- idea无法安装插件
- 职场:狼文化or羊文化
热门文章
- 谷歌flutter_在Flutter中使用Google Pay Through Stripe接受付款
- php在线拍照代码,JQ+PHP实现浏览器webcam摄像头在线定时自动拍照存储照片
- shopex 网店系统 v4.8.5 安装图文教
- 三菱PLC与欧姆龙PLC通讯
- 泰坦尼克号预测结果分析报告
- 在虚拟机centos7中使用docker安装nginx后,本地浏览器无法访问?
- 待业在家的6个月,我靠淘宝月入百万:你看不起的行业,往往很赚钱
- tracert命令详解
- 四川大学计算机学院优秀毕业论文,(完整版)四川大学本科_毕业论文(设计)_有关规定...
- 平稳性的检验 java_[时间序列分析]--平稳性,白噪声的检验