java中文排序逻辑

出处:http://blog.csdn.net/ethanq/article/details/7192042
http://blog.csdn.net/hui_lang/article/details/7515674

在Java中一般的String数组排序可以调用Arrays类的sort(Object[] a)方法进行排序,代码类似:

[java] view plain copy print?
String[] strs = {"张三(Z)", "李四(L)", "王五(W)"};  

// 排序,默认是升序
Arrays.sort(strs);
但是当我们将以上结果打印出来,你会发现结果很混乱,并不是和我们预想的那样按照汉语拼音进行排序的。为何呢?我们知道该方法是通过数组元素的compareTo方法来进行比较的,那我们看看String类的compareTo的主要实现:

[java] view plain copy print?
while (k < lim) {  
    // 原字符串的字符数组  
    char c1 = v1[k];  
    // 比较字符串的字符数组   
    char c2 = v2[k];  
    if (c1 != c2) {   
        // 比较两者的char值大小   
        return c1 - c2;  
    }  
    k++;  
}  
    上面的代码先取得字符串的字符数组,然后一个一个地比较大小,这里是对字符进行比较(使用减号),也就是UNICODE码值进行比较,而并不是通过汉字的拼音进行排序的,这一点在JDK的说明文档中也有说明:对于非英文的String排序可能会出现不准确的情况。那该如何解决该问题呢?Java推荐使用Collator类进行排序,代码如下:
[java] view plain copy print?
String[] strs = {"张三(Z)", "李四(L)", "王五(W)"};  
// 定义一个中文排序器  
Comparator c = Collator.getInstance(Locale.CHINA);  
// 升序排序  
Arrays.sort(strs, c);  
    但是Java并不能精确的对所有的汉字进行排序,比如对“犇”和“鑫”进行排序,你就会发现结果又乱了!只是因为我们的汉字文化太博大精深了,要做好这个排序确实有点难为Java了。更深层次的原因是Java使用的是 UNICODE 编码,而中文 UNICODE 字符集是来源于 GB18030 的,GB18030 又是从GB2312 发展起来的, GB2312 是一个包含  7000 多个字符的字符集,它是按照拼音排序,并且是连续的,之后的 GBK、GB2312 都是在起基础上扩充而来的,所以要让它们完整排序也就难上加难了。但如果排序对象是经常使用的汉字,使用Collator类排序完全可以满足我们的要求。
    如果需要严格排序,可以使用一些开源项目来自己实现,比如 pinyin4j 可以把汉字转换为拼音,然后我们自己来实现排序算法,不过此时你也会发现要考虑诸如算法、同音字、多音字等众多问题。

    pinyin4j下载地址:http://pinyin4j.sourceforge.net/

//本地代码

import java.text.Collator;

// List排序 customerDate
            List<CusIdName> customersss = new ArrayList<CusIdName>();
            customersss.addAll(customerDate);
            Collections.sort(customersss, new Comparator<CusIdName>() {
                @Override
                public int compare(CusIdName o1, CusIdName o2) {
                    return o1.getCusName().compareTo(o2.getCusName());
                }
            });
            // List排序 groupDate
            List<GroIdName> groupDatesss = new ArrayList<GroIdName>();
            groupDatesss.addAll(groupDate);
            Collections.sort(groupDatesss, new Comparator<GroIdName>() {            
                Collator clt = Collator.getInstance();//排序对于中文以拼音排序
                @Override
                public int compare(GroIdName o1, GroIdName o2) {
                    return clt.compare(o1.getGroName(), o2.getGroName());
                }
            });

注:对于Java对象的值等判断 仅仅对于对象的属性的id与userName判断则是需要重写hashcode equals方法,方法体的内部参数 有且仅有 id userName

文章参考:《编写高质量代码:改善Java程序的151个建议》的建议59。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值