最近項目上使用到漢字排序的問題,網上搜索了一下后普遍使用下面的方法比較。
@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