<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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://m.tkk7.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 閱讀(5530) 評論(3)  編輯  收藏 所屬分類: 跟老劉學Java

    評論:
    # re: 中文排序 - 漢語拼音[未登錄] 2007-12-19 09:04 | stone
    有意思,受教了  回復  更多評論
      
    # re: 中文排序 - 漢語拼音 2007-12-19 10:05 | 千里冰封
    呵呵,有意思  回復  更多評論
      
    # re: 中文排序 - 漢語拼音[未登錄] 2012-06-11 16:58 | 111
    很干凈
    飛過海
    啊啊  回復  更多評論
      
    主站蜘蛛池模板: 99在线观看免费视频| 两个人日本WWW免费版| 久久久久久免费视频| 亚洲黄色在线观看| 59pao成国产成视频永久免费| 亚洲国产精品无码久久久秋霞2 | 四虎影视成人永久免费观看视频 | 免费国产成人高清在线观看麻豆| 亚洲日韩AV一区二区三区四区 | 亚洲国产一级在线观看| v片免费在线观看| 亚洲一区二区三区影院| 鲁丝片一区二区三区免费| 久久久久亚洲AV成人无码| 亚洲视频免费在线播放| 中文字幕亚洲情99在线| 免费A级毛片无码久久版| 九一在线完整视频免费观看| 亚洲免费观看视频| 最近中文字幕免费完整| 亚洲香蕉在线观看| 成人亚洲网站www在线观看| 久久国产美女免费观看精品| 亚洲一区影音先锋色资源| 欧美在线看片A免费观看| 久久精品国产亚洲av天美18 | 免费中文字幕在线| 一出一进一爽一粗一大视频免费的| 亚洲精品无码专区在线在线播放| 国产精品区免费视频| 亚洲精品美女久久久久久久| 亚洲黄片毛片在线观看| 秋霞人成在线观看免费视频 | 亚洲制服在线观看| gogo全球高清大胆亚洲| 一级毛片在线观看免费| 韩国亚洲伊人久久综合影院| 亚洲AV无码乱码在线观看裸奔| 成人免费无码视频在线网站| 国产免费久久久久久无码| 亚洲免费二区三区|