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

來源自:z77z的小碼窩

最近開發(fā)手機(jī)端OA系統(tǒng)通訊錄時(shí)遇到了用漢字首字母排序的問題,各種谷歌后發(fā)現(xiàn)了一個(gè)輪子pinyin4J
,這個(gè)輪子是可以將漢字轉(zhuǎn)換成字母拼音,個(gè)人覺得很好用,完美的解決了排序的問題,分享一下。

一.工具介紹

pinyin4j是一個(gè)支持將簡(jiǎn)體和繁體中文轉(zhuǎn)換到成拼音的Java開源類庫(kù),作者是Li Min (xmlerlimin@gmail.com)。

  • 支持同一漢字有多個(gè)發(fā)音
  • 還支持拼音的格式化輸出,比如第幾聲之類的,
  • 同時(shí)支持簡(jiǎn)體中文、繁體中文轉(zhuǎn)換為拼音…使用起來也非常簡(jiǎn)單。

本文只是使用了pinyin4J的主要功能,還有更多更好耍的功能,大家可以去研究官網(wǎng)文檔。

下載解壓后的目錄結(jié)構(gòu)及說明如下

(1) doc : pinyin4j的api文檔
(2) lib : pinyin4j的jar包
(3) src: pinyin4j的源代碼
(4) CHANGELOG.txt : pinyin4j的版本更新日志
(5) COPYING.txt : LICENSE說明
(6) README.txt : pinyin4j的概要介紹

二.轉(zhuǎn)換代碼

// 獲取漢字的首字母大寫
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) { //如果已經(jīng)是字母就不用轉(zhuǎn)換了
      try {
        //獲取當(dāng)前漢字的全拼
        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') {// 將大寫轉(zhuǎn)換為小寫
          arr[0] += 32;
      }*/
      pybf.append(arr[i]);
    }
  }
  return pybf.toString();
}

三.實(shí)現(xiàn) Comparable 接口并且使用內(nèi)部類compare重載compareTo方法實(shí)現(xiàn)排序代碼。

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")));
  }
});

四.測(cè)試效果

測(cè)試效果

五.那么問題來了

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基本概念 字符(Character) 是各種文字和符號(hào)的總稱,包括各國(guó)家文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等。 字符集...
    chiguozi閱讀 2,548評(píng)論 0 2
  • 【導(dǎo)語(yǔ)】兄弟一生一起走,那些日子不再有!也許兄弟在身邊,男人就更有一份自信,可并不是每個(gè)兄弟都是能夠陪伴你到最后的...
    靦腆的蘑菇魚閱讀 611評(píng)論 0 0
  • 一大早還在熟睡中。。。模糊中抓起電話。老媽已經(jīng)打來3個(gè)電話了,因?yàn)槭庆o音。沒及時(shí)接到,昨晚我們就定好,今早去望海寺...
    梓睿2017閱讀 311評(píng)論 0 1
  • 喝一杯茶 想一些人 麻辣姬絲 朋友送了一包新茶,西湖龍井。坐在電腦前,靜靜地給自己泡上一杯,用透明的玻璃杯。我喜歡...
    麻辣姬絲閱讀 626評(píng)論 6 8

友情鏈接更多精彩內(nèi)容