<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://www.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
    很干凈
    飛過海
    啊啊  回復  更多評論
      
    主站蜘蛛池模板: 亚洲不卡影院午夜在线观看| 久久久久亚洲精品日久生情| 国产精品永久免费| 成年女人午夜毛片免费视频 | 四虎永久在线观看免费网站网址| 亚洲成a人片在线观看无码| a毛片在线还看免费网站| 亚洲日产韩国一二三四区| 免费人成激情视频在线观看冫| 亚洲真人无码永久在线| 日韩免费高清播放器| 亚洲国产综合无码一区| 最近2019免费中文字幕6| 91久久亚洲国产成人精品性色| 91人人区免费区人人| 亚洲国产片在线观看| 亚洲免费综合色在线视频| 亚洲日韩AV一区二区三区中文| 岛国片在线免费观看| 羞羞的视频在线免费观看| 亚洲人成网站在线观看青青| 亚洲欧洲自拍拍偷午夜色| 最近2019中文字幕免费看最新| 亚洲av中文无码乱人伦在线观看 | av午夜福利一片免费看久久| 中文字幕久久亚洲一区| 男人的天堂网免费网站| 精品亚洲A∨无码一区二区三区| 7723日本高清完整版免费| 亚洲高清国产拍精品26U| 一级毛片免费观看不卡视频| 亚洲成人激情小说| 亚洲无线一二三四区手机| 免费无遮挡无码永久视频| 亚洲成人动漫在线| 成在人线AV无码免费| 香蕉免费在线视频| 在线A亚洲老鸭窝天堂| 1000部拍拍拍18免费网站| 亚洲美女色在线欧洲美女| 日韩免费高清视频网站|