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());
而且注意例子中只是截取了首漢字進行排序,若需要可以進一步的排序。
但主要還是中文的排序確實正確了。
基本原理:
其實弄來弄去,原理還是把漢字轉成拼音,然後再進行排序罷了。所以如果在專案中有遇到過需要把漢字轉換成拼音的需求的話。碰到漢字排序的話問題自然也會迎刃而解。
也不得不感嘆一句,在中國做研發比外國要辛苦啊。起碼字符集就多了那麼多,而且也沒得到很多基本的支援,然後引發的一連串問題。例如亂碼,漢字排序,轉拼音等什麼的...
不過解決一個記下一個吧,以後就能直接使用了,算多學一點。