美文网首页
通讯录之按汉字首字母排序

通讯录之按汉字首字母排序

作者: 涉世之初99 | 来源:发表于2017-03-26 00:29 被阅读0次

    来源自:z77z的小码窝

    最近开发手机端OA系统通讯录时遇到了用汉字首字母排序的问题,各种谷歌后发现了一个轮子pinyin4J
    ,这个轮子是可以将汉字转换成字母拼音,个人觉得很好用,完美的解决了排序的问题,分享一下。

    一.工具介绍

    pinyin4j是一个支持将简体和繁体中文转换到成拼音的Java开源类库,作者是Li Min (xmlerlimin@gmail.com)。

    • 支持同一汉字有多个发音
    • 还支持拼音的格式化输出,比如第几声之类的,
    • 同时支持简体中文、繁体中文转换为拼音…使用起来也非常简单。

    本文只是使用了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")));
      }
    });
    

    四.测试效果

    测试效果

    五.那么问题来了

    这个列子只能按字符串第一个字符的首字母来排序,比如字符串张三赵五第一个字符首字母是一样的,那能不能再通过第二个字符来进行排序呐。如果字符串的第二个字符首字母也是一样的呐,依次类推。希望哪位大神好的思路交流交流,带我装逼带我飞。。。

    相关文章

      网友评论

          本文标题:通讯录之按汉字首字母排序

          本文链接:https://www.haomeiwen.com/subject/obehottx.html