<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
    很干凈
    飛過海
    啊啊  回復  更多評論
      
    主站蜘蛛池模板: 亚洲首页国产精品丝袜| 亚洲国产一成人久久精品| 内射干少妇亚洲69XXX| 韩国免费a级作爱片无码| 亚洲精品tv久久久久| 美女被羞羞网站免费下载| 国产99视频精品免费视频7| 亚洲AV综合色区无码一二三区 | 羞羞视频在线观看免费| 四虎影院永久免费观看| 苍井空亚洲精品AA片在线播放 | 亚洲AV无码成人精品区蜜桃| 国产中文字幕在线免费观看| 亚洲人成精品久久久久| 日本卡1卡2卡三卡免费| 亚洲黄色在线观看视频| 手机看黄av免费网址| 亚洲成av人片在线天堂无| 四虎永久免费地址在线观看| 国产黄在线观看免费观看不卡| 亚洲男人的天堂www| 99久久国产免费-99久久国产免费| 亚洲第一页在线播放| 在线天堂免费观看.WWW| 亚洲日本一线产区和二线产区对比| 日韩精品视频免费在线观看| 乱爱性全过程免费视频| 亚洲91av视频| 永久免费观看的毛片的网站| 一个人看的www免费在线视频| 久久久亚洲精品国产| 最近最新MV在线观看免费高清| 黄床大片30分钟免费看| 亚洲成AV人片在WWW色猫咪 | 免费高清资源黄网站在线观看| 国产亚洲精品精品精品| 久久亚洲综合色一区二区三区 | 亚洲精品国产免费| 亚洲av无码偷拍在线观看| 久久久久国产成人精品亚洲午夜| 外国成人网在线观看免费视频|