含中文的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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章