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

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


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


          合并了

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

          /**
            * @author Jeff
            *
            * Copyright (c) 復(fù)制或轉(zhuǎn)載本文,請保留該注釋。
            */
          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) { // 兩個(gè)字符都是漢字
                              if (!pinyin1.equals(pinyin2)) {
                                  return pinyin1.compareTo(pinyin2);
                              }
                          } else {
                              return codePoint1 - codePoint2;
                          }
                      }
                  }
                  return o1.length() - o2.length();
              }

              /**
               * 字符的拼音,多音字就得到第一個(gè)拼音。不是漢字,就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 閱讀(5535) 評論(3)  編輯  收藏 所屬分類: 跟老劉學(xué)Java

          評論:
          # re: 中文排序 - 漢語拼音[未登錄] 2007-12-19 09:04 | stone
          有意思,受教了  回復(fù)  更多評論
            
          # re: 中文排序 - 漢語拼音 2007-12-19 10:05 | 千里冰封
          呵呵,有意思  回復(fù)  更多評論
            
          # re: 中文排序 - 漢語拼音[未登錄] 2012-06-11 16:58 | 111
          很干凈
          飛過海
          啊啊  回復(fù)  更多評論
            
          主站蜘蛛池模板: 京山县| 桃园市| 绥中县| 丰镇市| 开封县| 邵东县| 清新县| 时尚| 棋牌| 长白| 射洪县| 林周县| 湖南省| 扎兰屯市| 秦皇岛市| 江阴市| 本溪| 南昌县| 崇礼县| 盐源县| 民县| 当雄县| 偏关县| 嘉鱼县| 贺兰县| 衢州市| 陆良县| 阿尔山市| 巨野县| 郧西县| 冕宁县| 南部县| 临澧县| 盐亭县| 黄龙县| 富顺县| 广东省| 尚志市| 全椒县| 丰镇市| 麻阳|