java 汉字拼音排序_[转]Java汉字按照拼音排序
最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。
@Testpublic voidtest_sort_pinyin() {
Collator cmp=Collator.getInstance(java.util.Locale.CHINA);
String[] arr= { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A","1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情"};
List list =Arrays.asList(arr);
Arrays.sort(arr, cmp);
System.out.println(list);
}
输出结果如下:
[$%$#, 123, 1哈哈a, 1哈哈A, 1哈哈b, JAVA, 哈, 哈哈, 哈哈A, 李四, 王五, 张三, 赵六, 怡情]
发现了有个BUG,因为网上也看到一些朋友提出问题,所以测试时故意加上怡字。发现“怡”字果然最后了。所以只能再寻找解决办法。后来想起了之前把中文自动转拼音时使用到的类。
pinyin4j 开源项目 具体可以查看 http://pinyin4j.sourceforge.net/ 使用的是:pinyin4j-2.5.0.jar 这个包;
真的不得不感谢这位人士。
封装成比较器后代码如下:
importjava.util.Comparator;importnet.sourceforge.pinyin4j.PinyinHelper;/*** 汉字按照拼音排序的比较器
*@authorKennyLee 2009-2-23 10:08:59
**/
public class PinyinComparator implements Comparator{public intcompare(Object o1, Object o2) {char c1 = ((String) o1).charAt(0);char c2 = ((String) o2).charAt(0);returnconcatPinyinStringArray(
PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo(
concatPinyinStringArray(PinyinHelper
.toHanyuPinyinStringArray(c2)));
}privateString concatPinyinStringArray(String[] pinyinArray) {
StringBuffer pinyinSbf= newStringBuffer();if ((pinyinArray != null) && (pinyinArray.length > 0)) {for (int i = 0; i < pinyinArray.length; i++) {
pinyinSbf.append(pinyinArray[i]);
}
}returnpinyinSbf.toString();
}
}
继续执行测试
@Testpublic voidtest_sort_pinyin2() {
String[] arr= { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A","1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情"};
List list =Arrays.asList(arr);
Arrays.sort(arr,newPinyinComparator());
System.out.println(list);
}
最终打印效果如下:
[JAVA, 123, $%$#, 1哈哈A, 1哈哈b, 1哈哈a, 哈哈A, 哈哈, 哈, 李四, 王五, 怡情, 张三, 赵六]
不过也由此看出,对于符号等其他排序也有一些争议的地方,但是关系不大。或者也可以再判断一下首字是否为中文,若不是再按照其他相应的比较方式。比较器的好处就是可以自定义了。
例子中只是用了数组进行排序,但可能较多的情况下遇到的是对List的排序,即List。同样的可以举一反三的修改比较器中的compare方法,只要提取用来排序的的汉字关键字段出来即可。
然后比较的时候调用
Collections.sort(list,new PinyinComparator());
而且注意例子中只是截取了首汉字进行排序,若需要可以进一步的排序。
但主要还是中文的排序确实正确了。
基本原理:
其实弄来弄去,原理还是把汉字转成拼音,然后再进行排序罢了。所以如果在项目中有遇到过需要把汉字转换成拼音的需求的话。碰到汉字排序的话问题自然也会迎刃而解。
也不得不感叹一句,在中国做研发比外国要辛苦啊。起码字符集就多了那么多,而且也没得到很多基本的支持,然后引发的一连串问题。例如乱码,汉字排序,转拼音等什么的...
不过解决一个记下一个吧,以后就能直接使用了,算多学一点。
转自:http://blog.csdn.net/kennylee26/article/details/3926168
java 汉字拼音排序_[转]Java汉字按照拼音排序相关推荐
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- java 文件内容排序_在Java中对2个大型文本文件进行排序的最佳方法是什么?
我正在构建一个简单的 Java应用程序,涉及从csv文件中读取信息. csv文件中的信息以这种形式出现: "ID","Description" "AB ...
- java数组给名字排序_用Java给数组排序
public class BubbleDemo { public static void main(String[] args) { int arr[]={1,3,5,7,2,4,6,8,9}; bu ...
- java util包排序_实现java.util.Comparator接口,对对象集合进行多属性组合排序
Commons - BeanUtils 提供了很多功能,其中一个很有用的是对对象集合进行排序,如Collections.sort(peoples, new BeanComparator("a ...
- java 外部排序_完整java实现外部排序
外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的.选自百度百科. 第一步: 首先 ...
- java是什么格式_是java格式
错误:编码GBK的不可映射字符的解决办法 最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后 ...
- 达内java面试题集_达内java面试题
JAVA面试题-COREJAVA部分1.在main(String[] args)方法内是否可以调用一个非静态方法?答案:不能2.同一个文件里是否可以有两个public类?答案:不能3.方法名是否可以与 ...
- java 获得平台编码_关于Java平台的编码
需要注意编码格式的地方有很多,好多默认的编码格式也都是不统一的,如果设置不当,就容易出现中文乱码现象. 关于编辑器的编码: 用记事本和Eclipse编辑保存的文件,默认都是操作系统的编码,即GBK. ...
- java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)
哈夫曼树 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树, 若该树的带权路径长度(wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 也叫霍夫曼树. 哈 ...
- java ee开发环境_设置Java EE 6开发环境
java ee开发环境 本教程简要说明了如何设置典型的环境来开发基于Java EE 6的应用程序. 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外,本教程没有其他先决条件. ...
最新文章
- Hutool之集合工具——CollectionUtil
- go语言1.4版本将支持面向android开发,[翻译]Go语言1.4版本将支持面向Android开发
- 私有云搭建 OpenStack(centos7.3, centos-release-openstack-ocata)
- Ubuntu停止维护版本的软件源配置和系统升级方法
- 非常漂亮的后台登录页面
- nacos 下线接口_《掌门教育微服务体系 Solar | 阿里巴巴 Nacos 企业级落地中篇》...
- linux故障转移集群,部署AlwaysOn第一步:搭建Windows服务器故障转移集群
- Humble Numbers(丑数) 超详解!
- python简单代码-代码的重试机制(python简单实现)
- sql 去除数据表中一列中字符串后边的空格...
- HTTP协议基础及报文抓包分析
- abaqus实例手册_《ABAQUS 6.14超级学习手册》——1.5 ABAQUS帮助文档-阿里云开发者社区...
- PID参数整定快速入门(调节器参数整定方法)
- 〖Python 数据库开发实战 - MySQL篇㉕〗- 数据更新操作 - UPDATE 语句
- (Matlab实现)CNN卷积神经网络图片分类
- 计算机二级考试题库 操作题,2016计算机二级考试题库:《C++》基本操作题练习...
- Android 自定义按钮button 加图片和两行文字
- java 自旋锁实现
- 【应用多元统计分析】-王学民Python主成分分析例题,特征值处理和可视化(2)
- android之animator 和animation 的区别
热门文章
- 如何看懂这些该死的图形学公式
- matlab画柱状图函数,series函数做柱状图
- FAQ01【Hadoop】:Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
- 电视android怎么连接手机助手下载,手机怎么连到电视上?
- java tld tag_自定义标签tag(jsp编写)和tld(java编写)的使用方法
- 【课堂笔记精选】为了能够用“Unity”软件做游戏,我要从最基础的开始复习JavaScript...
- 划分离散数学定义_《离散数学》学习记录 - 集合论
- cocos creator 横版射击游戏全民吃鸡大战 H5+安卓+IOS三端源码
- 【Rust日报】 2020-01-10 track_caller 錯誤處理大突破
- python词云生成