隨筆-16  評(píng)論-50  文章-2  trackbacks-0

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


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


          合并了

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

          /**
            * @author Jeff
            *
            * Copyright (c) 復(fù)制或轉(zhuǎn)載本文,請(qǐng)保留該注釋。
            */
          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 閱讀(5540) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): 跟老劉學(xué)Java

          評(píng)論:
          # re: 中文排序 - 漢語(yǔ)拼音[未登錄](méi) 2007-12-19 09:04 | stone
          有意思,受教了  回復(fù)  更多評(píng)論
            
          # re: 中文排序 - 漢語(yǔ)拼音 2007-12-19 10:05 | 千里冰封
          呵呵,有意思  回復(fù)  更多評(píng)論
            
          # re: 中文排序 - 漢語(yǔ)拼音[未登錄](méi) 2012-06-11 16:58 | 111
          很干凈
          飛過(guò)海
          啊啊  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 胶南市| 马龙县| 巢湖市| 邢台县| 宁阳县| 盱眙县| 师宗县| 榕江县| 精河县| 博白县| 巩留县| 娄烦县| 赤壁市| 习水县| 平泉县| 托克托县| 安多县| 阜新市| 朝阳区| 佛学| 兴文县| 大关县| 色达县| 湄潭县| 治县。| 运城市| 柏乡县| 松滋市| 黄浦区| 穆棱市| 广南县| 樟树市| 称多县| 湖口县| 塔城市| 南陵县| 莱芜市| 冕宁县| 晴隆县| 古蔺县| 太谷县|