1. 程式人生 > >Java漢字按照拼音排序

Java漢字按照拼音排序

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

輸出結果如下:

[$%$#, 123, 1哈哈a, 1哈哈A, 1哈哈b, JAVA, 哈, 哈哈, 哈哈A, 李四, 王五, 張三, 趙六, 怡情]

發現了有個BUG,因為網上也看到一些朋友提出問題,所以測試時故意加上怡字。發現“怡”字果然最後了。所以只能再尋找解決辦法。後來想起了之前把中文自動轉拼音時使用到的類。

pinyin4j 開源專案 具體可以檢視 http://pinyin4j.sourceforge.net/

真的不得不感謝這位人士。

封裝成比較器後代碼如下:

繼續執行測試

最終列印效果如下:

[JAVA, 123, $%$#, 1哈哈A, 1哈哈b, 1哈哈a, 哈哈A, 哈哈, 哈, 李四, 王五, 怡情, 張三, 趙六]

不過也由此看出,對於符號等其他排序也有一些爭議的地方,但是關係不大。或者也可以再判斷一下首字是否為中文,若不是再按照其他相應的比較方式。比較器的好處就是可以自定義了。

例子中只是用了陣列進行排序,但可能較多的情況下遇到的是對List的排序,即List<Object>。同樣的可以舉一反三的修改比較器中的compare方法,只要提取用來排序的的漢字關鍵欄位出來即可。

然後比較的時候呼叫

Collections.sort(list,new PinyinComparator());

而且注意例子中只是截取了首漢字進行排序,若需要可以進一步的排序。

但主要還是中文的排序確實正確了。

基本原理:

其實弄來弄去,原理還是把漢字轉成拼音,然後再進行排序罷了。所以如果在專案中有遇到過需要把漢字轉換成拼音的需求的話。碰到漢字排序的話問題自然也會迎刃而解。

也不得不感嘆一句,在中國做研發比外國要辛苦啊。起碼字符集就多了那麼多,而且也沒得到很多基本的支援,然後引發的一連串問題。例如亂碼,漢字排序,轉拼音等什麼的...

不過解決一個記下一個吧,以後就能直接使用了,算多學一點。