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

@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/   使用的是:pinyin4j-2.5.0.jar  这个包;

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

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

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());

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

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

基本原理:

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

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

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

转自:http://blog.csdn.net/kennylee26/article/details/3926168

[转]Java汉字按照拼音排序的更多相关文章

  1. MySQL按照汉字的拼音排序

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  2. MySQL按照汉字的拼音排序,mysql汉字排序

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  3. MySQL按照汉字的拼音排序(转)

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...

  4. MySQL按照汉字的拼音排序、按照首字母分类

    项目中有时候需要按照汉字的拼音排序,比如联系人列表.矿物分类等,有的还需要按拼音字母从A到Z分类显示. 如果存储汉字的字段编码使用的是GBK字符集,因为GBK内码编码时本身就采用了拼音排序的方法(常用 ...

  5. TP5 按照汉字的拼音排序

    业务需求:接口返回一个列表,但是这个列表要求按一定的条件排序,条件如下: 1,某字段(field1)为null的排前面 2,某字段(field2)为null的排前面 3,姓名(field3)按照汉字的 ...

  6. java汉字转拼音以及得到首字母通用方法

    package oa.common.utils;   import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.piny ...

  7. java 汉字转拼音

    先决条件: pinyin4j.jar(Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换.拼音输出格式可以定制.) 下载地址:http://pan.baidu.com/share/l ...

  8. js中文汉字按拼音排序

    JavaScript 提供本地化文字排序,比如对中文按照拼音排序,不需要程序显示比较字符串拼音. String.prototype.localeCompare 在不考虑多音字的前提下,基本可以完美实现 ...

  9. java汉字转拼音的工具类

    import com.google.common.base.Strings;import net.sourceforge.pinyin4j.PinyinHelper;import net.source ...

随机推荐

  1. LeeCode-Spiral Matrix II

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  2. Hamming code

    Also known as (7,4) code,7 trainsmitted bits for 4 source code. TRANSMIT The transmitted procedure c ...

  3. Eclipse配置Maven开发环境

    前言: 现在Eclipse版本越来越高.高版本的Eclipse甚至已经集成了Maven像是SpringSource的哪个版本.用习惯了Eclipse.在开发中还是不想更换掉自己的IDE.如此一来就又了 ...

  4. linux 修改文件、文件夹权限

    # change owner of all the fies under dirName chown -R username dirName #change owner and the file gr ...

  5. 电子设计省赛--DMA与ADC

    //2014年4月17日 //2014年6月20日入"未完毕" //2014年6月21日 DMA可实现无需cpu控制中断的传输数据保存. 特别是ADC转换多个通道时要用到. 关键是 ...

  6. toj2867 Picking Problem

    题目链接:http://acm.tju.edu.cn/toj/showp.php?pid=2867 题目大意:给定一系列活动的开始时间和结束时间,问最多能参加的活动数目 思路:// 本题属于最大区间调 ...

  7. Expected authority at index 7: hdfs://

    hadoop版本:1.0.4 今天在跑TestForest的时候,居然出现了这个问题: Exception in thread "main" java.lang.IllegalAr ...

  8. ExtJs4.0入门错误

    当在eclipse中的web工程中增加了extjs4,出现An internal error occurred during: "Building workspace". Java ...

  9. AFNetworking之多图片-文件上传

    在分享经验之前,先说点题外话,之前的一个项目涉及到了多图片的上传,本来以为是一个很简单的事情,却着实困扰了我好久,究其原因,一是我不够细心,二是与后台人员的交流不够充分.在此,我想将我的老师常说的一句 ...

  10. C#之回到了最初的起点----解决方案、项目、程序集、命名空间

    C#之回到了最初的起点----解决方案.项目.程序集.命名空间 ——Percy 初学者很容易把这些概念搞混淆.先说说项目(Project),通俗的说,一个项目可以就是你开发的一个软件.在.Net下,一 ...