最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。

@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汉字按照拼音排序相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java 文件内容排序_在Java中对2个大型文本文件进行排序的最佳方法是什么?

    我正在构建一个简单的 Java应用程序,涉及从csv文件中读取信息. csv文件中的信息以这种形式出现: "ID","Description" "AB ...

  3. java数组给名字排序_用Java给数组排序

    public class BubbleDemo { public static void main(String[] args) { int arr[]={1,3,5,7,2,4,6,8,9}; bu ...

  4. java util包排序_实现java.util.Comparator接口,对对象集合进行多属性组合排序

    Commons - BeanUtils 提供了很多功能,其中一个很有用的是对对象集合进行排序,如Collections.sort(peoples, new BeanComparator("a ...

  5. java 外部排序_完整java实现外部排序

    外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的.选自百度百科. 第一步:      首先 ...

  6. java是什么格式_是java格式

    错误:编码GBK的不可映射字符的解决办法 最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后 ...

  7. 达内java面试题集_达内java面试题

    JAVA面试题-COREJAVA部分1.在main(String[] args)方法内是否可以调用一个非静态方法?答案:不能2.同一个文件里是否可以有两个public类?答案:不能3.方法名是否可以与 ...

  8. java 获得平台编码_关于Java平台的编码

    需要注意编码格式的地方有很多,好多默认的编码格式也都是不统一的,如果设置不当,就容易出现中文乱码现象. 关于编辑器的编码: 用记事本和Eclipse编辑保存的文件,默认都是操作系统的编码,即GBK. ...

  9. java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)

    哈夫曼树 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树, 若该树的带权路径长度(wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 也叫霍夫曼树. 哈 ...

  10. java ee开发环境_设置Java EE 6开发环境

    java ee开发环境 本教程简要说明了如何设置典型的环境来开发基于Java EE 6的应用程序. 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外,本教程没有其他先决条件. ...

最新文章

  1. Hutool之集合工具——CollectionUtil
  2. go语言1.4版本将支持面向android开发,[翻译]Go语言1.4版本将支持面向Android开发
  3. 私有云搭建 OpenStack(centos7.3, centos-release-openstack-ocata)
  4. Ubuntu停止维护版本的软件源配置和系统升级方法
  5. 非常漂亮的后台登录页面
  6. nacos 下线接口_《掌门教育微服务体系 Solar | 阿里巴巴 Nacos 企业级落地中篇》...
  7. linux故障转移集群,部署AlwaysOn第一步:搭建Windows服务器故障转移集群
  8. Humble Numbers(丑数) 超详解!
  9. python简单代码-代码的重试机制(python简单实现)
  10. sql 去除数据表中一列中字符串后边的空格...
  11. HTTP协议基础及报文抓包分析
  12. abaqus实例手册_《ABAQUS 6.14超级学习手册》——1.5 ABAQUS帮助文档-阿里云开发者社区...
  13. PID参数整定快速入门(调节器参数整定方法)
  14. 〖Python 数据库开发实战 - MySQL篇㉕〗- 数据更新操作 - UPDATE 语句
  15. (Matlab实现)CNN卷积神经网络图片分类
  16. 计算机二级考试题库 操作题,2016计算机二级考试题库:《C++》基本操作题练习...
  17. Android 自定义按钮button 加图片和两行文字
  18. java 自旋锁实现
  19. 【应用多元统计分析】-王学民Python主成分分析例题,特征值处理和可视化(2)
  20. android之animator 和animation 的区别

热门文章

  1. 如何看懂这些该死的图形学公式
  2. matlab画柱状图函数,series函数做柱状图
  3. FAQ01【Hadoop】:Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  4. 电视android怎么连接手机助手下载,手机怎么连到电视上?
  5. java tld tag_自定义标签tag(jsp编写)和tld(java编写)的使用方法
  6. 【课堂笔记精选】为了能够用“Unity”软件做游戏,我要从最基础的开始复习JavaScript...
  7. 划分离散数学定义_《离散数学》学习记录 - 集合论
  8. cocos creator 横版射击游戏全民吃鸡大战 H5+安卓+IOS三端源码
  9. 【Rust日报】 2020-01-10 track_caller 錯誤處理大突破
  10. python词云生成