1. 程式人生 > >通訊錄之按漢字首字母排序-java

通訊錄之按漢字首字母排序-java

最近開發手機端OA系統通訊錄時遇到了用漢字首字母排序的問題,各種谷歌後發現了一個輪子pinyin4J,這個輪子是可以將漢字轉換成字母拼音,個人覺得很好用,完美的解決了排序的問題,分享一下。

原部落格地址

一.工具介紹

pinyin4j是一個支援將簡體和繁體中文轉換到成拼音的Java開源類庫,作者是Li Min ([email protected])。

  • 支援同一漢字有多個發音
  • 還支援拼音的格式化輸出,比如第幾聲之類的,
  • 同時支援簡體中文、繁體中文轉換為拼音…使用起來也非常簡單。下面是其官方網址,其中提供了下載:
  • 本文只是使用了pinyin4J的主要功能,還有更多更好耍的功能,大家可以去研究官網文件。哈哈

下載解壓後的目錄結構及說明如下
(1) doc : pinyin4j的api文件
(2) lib : pinyin4j的jar包
(3) src: pinyin4j的原始碼
(4) CHANGELOG.txt : pinyin4j的版本更新日誌
(5) COPYING.txt : LICENSE說明
(6) README.txt : pinyin4j的概要介紹

二.轉換程式碼

// 獲取漢字的首字母大寫
public String getFirstSpell(String string) {
    StringBuffer pybf = new
StringBuffer(); char[] arr = string.toCharArray(); HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); for (int i = 0; i < arr.length; i++) { if
(arr[i] > 128) { //如果已經是字母就不用轉換了 try { //獲取當前漢字的全拼 String[] temp = PinyinHelper.toHanyuPinyinStringArray( arr[i], defaultFormat); if (temp != null) { pybf.append(temp[0].charAt(0));// 取首字母 } } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } } else { if (arr[i] >= 'a' && arr[i] <= 'z') { arr[i] -= 32; } /*if (arr[0] >= 'A' && arr[0] <= 'Z') {// 將大寫轉換為小寫 arr[0] += 32; }*/ pybf.append(arr[i]); } } return pybf.toString(); }

三.實現 Comparable 介面並且使用內部類compare過載compareTo方法實現排序程式碼。

Collections.sort(list, new Comparator<Map<String, Object>>() {
    public int compare(Map<String, Object> o1, Map<String, Object> o2) {
        return getFirstSpellOne((String) o1.get("str"))
                .compareTo(
                        getFirstSpellOne((String) o2
                                .get("str")));
    }
});

四.測試效果

測試效果

五.那麼問題來了

這個列子只能按字串第一個字元的首字母來排序,比如字串張三趙五第一個字元首字母是一樣的,那能不能再通過第二個字元來進行排序吶。如果字串的第二個字元首字母也是一樣的吶,依次類推。希望哪位大神好的思路交流交流,帶我裝逼帶我飛。。。

六.JUST DO IT

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。