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

@Test public void test_sort_pinyin() { Collator cmp = Collator.getInstance(java.util.Locale.CHINA); String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A", "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" }; List<String> 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/

真的不得不感谢这位人士。

封装成比较器后代码如下:

import java.util.Comparator; import net.sourceforge.pinyin4j.PinyinHelper; /** * 汉字按照拼音排序的比较器 * @author KennyLee 2009-2-23 10:08:59 * */ public class PinyinComparator implements Comparator<Object> { public int compare(Object o1, Object o2) { char c1 = ((String) o1).charAt(0); char c2 = ((String) o2).charAt(0); return concatPinyinStringArray( PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo( concatPinyinStringArray(PinyinHelper .toHanyuPinyinStringArray(c2))); } private String concatPinyinStringArray(String[] pinyinArray) { StringBuffer pinyinSbf = new StringBuffer(); if ((pinyinArray != null) && (pinyinArray.length > 0)) { for (int i = 0; i < pinyinArray.length; i++) { pinyinSbf.append(pinyinArray[i]); } } return pinyinSbf.toString(); } }

继续执行测试

@Test public void test_sort_pinyin2() { String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A", "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" }; List<String> list = Arrays.asList(arr); Arrays.sort(arr, new PinyinComparator()); System.out.println(list); }

最终打印效果如下:

[JAVA, 123, $%$#, 1哈哈A, 1哈哈b, 1哈哈a, 哈哈A, 哈哈, 哈, 李四, 王五, 怡情, 张三, 赵六]


不过也由此看出,对于符号等其他排序也有一些争议的地方,但是关系不大。或者也可以再判断一下首字是否为中文,若不是再按照其他相应的比较方式。比较器的好处就是可以自定义了。

例子中只是用了数组进行排序,但可能较多的情况下遇到的是对List的排序,即List<Object>。同样的可以举一反三的修改比较器中的compare方法,只要提取用来排序的的汉字关键字段出来即可。

然后比较的时候调用

Collections.sort(list,new PinyinComparator());

而且注意例子中只是截取了首汉字进行排序,若需要可以进一步的排序。

但主要还是中文的排序确实正确了。

基本原理:

其实弄来弄去,原理还是把汉字转成拼音,然后再进行排序罢了。所以如果在项目中有遇到过需要把汉字转换成拼音的需求的话。碰到汉字排序的话问题自然也会迎刃而解。

也不得不感叹一句,在中国做研发比外国要辛苦啊。起码字符集就多了那么多,而且也没得到很多基本的支持,然后引发的一连串问题。例如乱码,汉字排序,转拼音等什么的...

不过解决一个记下一个吧,以后就能直接使用了,算多学一点。

Java汉字按照拼音排序相关推荐

  1. java 汉字按拼音排序_Java汉字按照拼音排序

    @Test public void testSortPinyin() { Collator cmp = Collator.getInstance(java.util.Locale.CHINA); St ...

  2. Android/Java汉字按照拼音排序

    汉字排序之前: peopleList.add(new NameBean("风四娘"));peopleList.add(new NameBean("连城璧")); ...

  3. java拼音搜索排序算法_Java汉字按照拼音排序

    最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较. @Test public void test_sort_pinyin() { Collator cmp = Collator. ...

  4. java 汉字转拼音_推荐一款前端汉字转拼音组件工具

    推荐一个前端的汉字转拼音组件 hotoo/pinyin, 支持在 Node 和 Web 浏览器环境运行. github网址:https://github.com/hotoo/pinyin 特性 根据词 ...

  5. Java汉字转拼音(全拼、首字母拼)

    Java汉字转拼音(全拼.首字母拼) public class ChineseToEnglish { /*** 汉字转拼音* @param src* @return*/public static St ...

  6. java汉字转拼音(全拼、简拼)

    java汉字转拼音(全拼.简拼) <dependency><groupId>com.belerweb</groupId><artifactId>piny ...

  7. 记录一下:Java 汉字获取拼音或首字母工具类

    记录一下:Java 汉字获取拼音或首字母工具类 Maven依赖配置 Java代码 本文主要记录一下在Java中,如何将字符串中的中文转化为拼音,获取汉字串拼音首字母,获取汉字串拼音的工具类,以及相关的 ...

  8. 表格排序 支持汉字按拼音排序,面向对象的使用方法

    周末无聊利用swapNode方法写了个排序算法,性能比较一般,超简单的冒泡排序,但是由于使用了swapNode,所以TR以及TD对象后绑定的属性不会丢失,同时解决了checkbox在swapNode后 ...

  9. java 汉字转换拼音

    java 汉字转换拼音 maven依赖 <dependency><groupId>com.belerweb</groupId><artifactId>p ...

最新文章

  1. do while循环语句_Python 自学笔记 - while 循环语句
  2. 软件分类:自由软件、开放源代码软件、公共软件、私有软件、版权所无软件...
  3. MariaDB通过命令行的方式导出指定数据库和还原指定数据库
  4. node php环境变量配置,关于NodeJS、NPM安装配置步骤(windows版本) 以及环境变量的介绍...
  5. 【分布式ID】键高并发 分布式 全局唯一 ID 雪花算法 snowflake
  6. [Ext JS 4] 实战之Load Mask - 在Grid Reconfigure的使用状况
  7. oracle var/tmp,[20141128]目录/var/tmp/oracle.txt
  8. Mysql之子父级查询
  9. 几何学五大公理_【欧几里德的平面几何五大公理是什么?】作业帮
  10. win7系统如何安装python_python安装教程详解|python下载安装教程步骤
  11. 千月2021全新改版影视app系统源码 影视app全新双端开源系统 全开源 带投屏 带教程
  12. 手机投屏到电视的5种方法 看完才知道原来这么简单!
  13. 数据库——数据库结构设计
  14. AIX上通过FTP下载压缩包损坏
  15. 关于macbookpro外接显示器(非扩展屏幕,只有一个外接显示器当屏幕)手贱把分辨率设置成1080i(显示器所不支持的分辨率)所造成显示器黑屏并弹出“不支持此视频格式”的解决方法
  16. 王垠:完全用Linux工作 (转载)
  17. C语言编程>第六周 ① 编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中。 在主函数中调用该函数计算出这n个整数之和。
  18. 大数据时代下对马克思主义的一些探讨
  19. 山寨“苹果皮”上市或涉嫌侵权iPhon
  20. Qt入门(一)——自己动动手写一个简易的用户化界面(Qt命令行模式)

热门文章

  1. Postman 实用接口测试执行顺序
  2. Xilinx XC7K70T-2FBG484I 可编程罗辑芯片
  3. Java后端技术栈,到底如何深入学习?
  4. 「镁客·请讲」周全:想做世界上没有的、比较酷的东西
  5. 电影/电视剧/综艺/动漫/游戏 下载链接搜索引擎
  6. 新疆、内蒙、青海三省区骆驼齐聚柴达木上演“激情与速度”
  7. 名帖77 刘弘珪 楷书《金刚般若波罗蜜经》
  8. 通过贝壳物联,让小度或天猫精灵语音控制你的8266
  9. 晚上几点入睡比较好,如果每天1点睡,8点半起,可以保持健康吗?
  10. 纸箱外观设计 包装盒版面设计 纸箱尺寸设计 纸箱纸盒包装设计 纸箱设计图