含中文的List列表按中文拼音排序的实现方式 Java

package com.zx.test;

import java.text.Collator;
import java.text.ParseException;
import java.text.RuleBasedCollator;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

public class SortChinese {

    public static void main(String[] args) {
        // simpleSortChina();

        String[] chinaStrs = new String[] { "作业", "测试", "Zhang", "test", "我们",
                "凹凸曼", "李四", "科比", "xin86", "Xin86", "zhang", "ao", "凹吧" };
        java.util.Arrays.sort(chinaStrs, new ChineseGB2312Comparator());
        for (String key : chinaStrs)
            System.out.print(key + "  ");
    }

    public static void simpleSortChina() {
        String[] chinaStrs = new String[] { "作业", "测试", "Zhang", "test", "我们",
                "凹凸曼", "李四", "科比", "xin86", "Xin86", "zhang", "ao", "凹吧" };
        Arrays.sort(chinaStrs, RuleBasedCollator.getInstance(Locale.CHINA));
        for (String string : chinaStrs) {
            System.out.print(string + "  ");
        }
    }

}

/**
 * RuleBasedCollator 类 getRules() 方法可以返回对应语言的规则设置。简体中文对应的规则是 gb2312 所对应的字符。
 * 我们可以把其中的全部汉字提取出来 对这些汉字重新排序 利用RuleBasedCollator(String rules) 构造器新建一个定制的
 * RuleBasedCollator
 * 
 * @author 新
 *
 */
class ChineseGB2312Collator {

    /**
     * @return a customized RuleBasedCollator with Chinese characters (GB2312)
     *         sorted correctly
     */
    public static final RuleBasedCollator getFixedGB2312Collator() {
        RuleBasedCollator fixedGB2312Collator = null;
        try {
            fixedGB2312Collator = new java.text.RuleBasedCollator(
                    ChineseGB2312Collator.getGB2312SpecialChars() + GB2312Chars);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return fixedGB2312Collator;
    }

    /**
     * @return the special characters in GB2312 charset.
     * 
     */
    public static final String getGB2312SpecialChars() {
        RuleBasedCollator zh_CNCollator = (RuleBasedCollator) Collator
                .getInstance(Locale.CHINA);
        // index 2125 is the last symbol "╋"
        return zh_CNCollator.getRules().substring(0, 2125);
    }

    /**
     * 6763 Chinese characters in GB2312 charset
     */
    public static final String GB2312Chars = "<吖<阿<啊< 锕<嗄<哎<哀<唉<埃<挨<锿<挨<皑<癌<嗳<矮<蔼< 霭<艾<爱<砹<隘<嗌<嫒<碍<暧<瑷<安<桉<氨<庵< 谙<鹌<鞍<俺<垵<铵<揞<犴<岸<按<案<胺<暗<黯< 肮<昂<盎<凹<坳<敖<嗷<廒<獒<遨<熬<翱<聱<螯< 鳌<鏖<拗<袄<媪<嶴<傲<奥<骜<澳<懊<鏊"
            + "<八<巴<叭< 扒<吧<岜<芭<疤<捌<笆<粑<拔<茇<菝<跋<魃<把< 钯<靶<坝<爸<罢<鲅<霸<灞<掰<白<百<佰<柏<捭< 摆<呗<败<拜<稗<扳<班<般<颁<斑<搬<瘢<癍<阪< 阪<板<版<钣<舨<办<半<伴<扮<拌<绊<瓣<邦<帮< 梆<浜<绑<榜<膀<蚌<傍<棒<谤<蒡<磅<镑<勹<包< 孢<苞<胞<煲<龅<褒<雹<宝<饱<保<鸨<堡<葆<褓< 报<抱<豹<趵<鲍<暴<爆<陂<卑<杯<悲<碑<鹎<北< 贝<狈<邶<备<背<钡<倍<悖<被<惫<焙<辈<碚<蓓< 褙<鞴<鐾<奔<贲<锛<本<苯<畚<坌<笨<崩<绷<嘣< 甭<泵<迸<甏<蹦<逼<荸<鼻<匕<比<吡<妣<彼<秕< 俾<笔<舭<鄙<币<必<毕<闭<庇<畀<哔<毖<荜<陛< 毙<狴<铋<婢<庳<敝<萆<弼<愎<筚<滗<痹<蓖<裨< 跸<辟<弊<碧<箅<蔽<壁<嬖<篦<薜<避<濞<臂<髀< 璧<襞<边<砭<笾<编<煸<蝙<鳊<鞭<贬<扁<窆<匾< 碥<褊<卞<弁<忭<汴<苄<拚<便<变<缏<遍<辨<辩< 辫<灬<杓<彪<标<飑<髟<骠<膘<瘭<镖<飙<飚<镳< 表<婊<裱<鳔<憋<鳖<别<蹩<瘪<宾<彬<傧<斌<滨< 缤<槟<镔<濒<豳<摈<殡<膑<髌<鬓<冫<冰<兵<丙< 邴<秉<柄<炳<饼<禀<并<病<摒<拨<波<玻<剥<钵< 饽<啵<脖<菠<播<伯<孛<驳<帛<泊<勃<亳<钹<铂< 舶<博<渤<鹁<搏<箔<膊<踣<薄<礴<跛<簸<擘<檗< 逋<钸<晡<醭<卜<卟<补<哺<捕<不<布<步<怖<钚< 部<埠<瓿<簿";

}

/**
 * ChineseGB2312Comparator 类同时实现了 Comparator, Comparable 接口,这样以后能够使用 compare,
 * compareTo 方法的时候都可以使用这个类
 * 
 * @author 新
 *
 */
class ChineseGB2312Comparator implements Comparator<String>, Comparable<String> {
    private RuleBasedCollator GB2312Collator = ChineseGB2312Collator
            .getFixedGB2312Collator();
    private String str1;

    /**
     * @param str1
     */
    public ChineseGB2312Comparator(String str1) {
        this.str1 = str1;
    }

    /**
     * 
     */
    public ChineseGB2312Comparator() {
        this.str1 = "";
    }

    /**
     * @param str1
     * @param str2
     * @return an integer indicatint the comparison result
     * @see java.util.Comparator#compare(Object, Object)
     */
    public int compare(String str1, String str2) {
        return GB2312Collator.compare(str1, str2);
    }

    /**
     * @param str2
     * @return an integer indicatint the comparison result
     * @see java.lang.Comparable#compareTo(Object)
     */
    public int compareTo(String str2) {
        return GB2312Collator.compare(str1, str2);
    }
}

class CodeNameBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

// 对List列表按中文拼音排序的实现方式:
/**
 * 对List字符串数组进行排序
 * 
 * @author Administrator
 *
 */
class ComparatorList implements Comparator<Object> {

    public int compare(Object value1, Object value2) {
        // http://j2ee-yohn.javaeye.com/blog/272006 此帖子关于中文拼音排序很详细。
        // TODO Auto-generated method stub
        if (value1.getClass().getName()
                .equals("org.openjweb.core.util.CodeNameBean")) {
            String s1 = ((CodeNameBean) value1).getName().toString();
            String s2 = ((CodeNameBean) value2).getName().toString();
            return Collator.getInstance(Locale.CHINESE).compare(s1, s2);
        } else if (value1.getClass().getName().equals("java.lang.String")) {
            String s1 = value1.toString();
            String s2 = value2.toString();
            return Collator.getInstance(Locale.CHINESE).compare(s1, s2);
        }
        return 0; // 0表示相同。
    }

    public static List<?> sort(List<?> strList) {
        ComparatorList comp = new ComparatorList();
        Collections.sort(strList, comp);
        return strList; // 返回排序后的列表
    }
}

// 具体调用时,可使用下面的语句 list = ComparatorList.sort(list); 这样传入一个原始的
// list,返回一个经过排序后的list,排序后。上面的实现是按照字母表的顺序从A..Z的发音顺序排列的。

发布了71 篇原创文章 · 获赞 2 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章