隨筆-16  評論-50  文章-2  trackbacks-0

          摘要:中文一般都是按拼音來排序的。但Java中的String類是按Unicode編碼存儲數據的,因此,String類也是按Unicode編碼的大小來排序的。Sun公司提供一個Collator類來重新按不同的規則對字符串排序,但Collator對中文的排序方式只是不嚴格的拼音排序法。Microsoft的Excel和Sql Server實現了按拼音排序的功能,就比Collator實現的好多了。那如何在Java中實現類似Microsoft的拼音排序的方式呢?


          作者:Jeff 發表于:2007-12-19 08:30 最后更新于: 2007年12月21日 12:33
          版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本版權聲明
          http://www.aygfsteel.com/jeff-lau/archive/2007/12/19/168637.html


          合并了

          已經將《中文排序--筆畫》和《中文排序--漢語拼音》修改并合并《中文排序》中。這里只保留最后的代碼。實現的原理和方法請見中文排序

          /**
            * @author Jeff
            *
            * Copyright (c) 復制或轉載本文,請保留該注釋。
            */
          package chinese.utility;

          import java.util.Comparator;
          import net.sourceforge.pinyin4j.PinyinHelper;

          public class PinyinComparator implements Comparator<String> {

              public int compare(String o1, String o2) {

                  for (int i = 0; i < o1.length() && i < o2.length(); i++) {

                      int codePoint1 = o1.charAt(i);
                      int codePoint2 = o2.charAt(i);

                      if (Character.isSupplementaryCodePoint(codePoint1)
                              || Character.isSupplementaryCodePoint(codePoint2)) {
                          i++;
                      }

                      if (codePoint1 != codePoint2) {
                          if (Character.isSupplementaryCodePoint(codePoint1)
                                  || Character.isSupplementaryCodePoint(codePoint2)) {
                              return codePoint1 - codePoint2;
                          }

                          String pinyin1 = pinyin((char) codePoint1);
                          String pinyin2 = pinyin((char) codePoint2);

                          if (pinyin1 != null && pinyin2 != null) { // 兩個字符都是漢字
                              if (!pinyin1.equals(pinyin2)) {
                                  return pinyin1.compareTo(pinyin2);
                              }
                          } else {
                              return codePoint1 - codePoint2;
                          }
                      }
                  }
                  return o1.length() - o2.length();
              }

              /**
               * 字符的拼音,多音字就得到第一個拼音。不是漢字,就return null。
               */
              private String pinyin(char c) {
                  String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
                  if (pinyins == null) {
                      return null;
                  }
                  return pinyins[0];
              }
          }

          posted on 2007-12-19 08:30 Jeff Lau 閱讀(5534) 評論(3)  編輯  收藏 所屬分類: 跟老劉學Java

          評論:
          # re: 中文排序 - 漢語拼音[未登錄] 2007-12-19 09:04 | stone
          有意思,受教了  回復  更多評論
            
          # re: 中文排序 - 漢語拼音 2007-12-19 10:05 | 千里冰封
          呵呵,有意思  回復  更多評論
            
          # re: 中文排序 - 漢語拼音[未登錄] 2012-06-11 16:58 | 111
          很干凈
          飛過海
          啊啊  回復  更多評論
            
          主站蜘蛛池模板: 定远县| 南康市| 峡江县| 商城县| 高尔夫| 阜宁县| 古田县| 白朗县| 安岳县| 常山县| 库伦旗| 南溪县| 项城市| 灯塔市| 凤山县| 婺源县| 湟中县| 徐汇区| 防城港市| 鹤峰县| 墨玉县| 望江县| 潜江市| 革吉县| 青海省| 怀集县| 墨玉县| 金秀| 库伦旗| 桦川县| 丹阳市| 霍邱县| 五台县| 呼伦贝尔市| 昭觉县| 黄石市| 会东县| 宁波市| 米林县| 双牌县| 平和县|