[轉]Java漢字按照拼音排序


最近項目上使用到漢字排序的問題,網上搜索了一下后普遍使用下面的方法比較。

@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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM