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

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

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

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

    // Collator 類是用來執行區分語言環境的 String 比較的,這里選擇使用CHINA         

    Comparator cmp = Collator.getInstance(java.util.Locale.CHINA); 

    TreeMap tree=new TreeMap(cmp);    

      String[] arr = {"張三", "李四", "王五"};       

    // 使根據指定比較器產生的順序對指定對象數組進行排序。      

       Arrays.sort(arr, cmp);      

      for (int i = 0; i < arr.length; i++)         

        System.out.println(arr[i]);

     

     

    <script>
     names = ["張三", "李四", "王五", "劉六"];
     names.sort(function(a,b){return a.localeCompare(b)});//a,b 為數組a的某兩個值,自動傳入
     alert(names);
    </script>

     

    另:

    示例文本:



    String [] test = new String[] {
                    "作業",
                    "測試",
                    "test",
                    "我們",
                    "。空",
                    "鏤空",
                    "[",
                    "瀏",
                    "皙"
            };

    jdk 版本:

     1.5.6

    開發平臺:

     Eclipse 3.1

    關鍵字: 中文排序

     

    概述


    我們在應用程序中可能會經常遇到對中文排序的問題,例如姓名列表,詞匯表等等。對中文排序,我們使用比較多的是根據漢語拼音發音來確定順序。

    我們可能會經常使用 

    1. java.util.Set

     接口,

    1. java.util.Arrays .sort((T[] a, Comparator <? super  T> c))

     等類或方法對含有中文字符的對象進行排序,但是這些在默認情況下都是調用 

    1. String .CompareTo(String )

    方法,這個方法是比較2個字符的 codepoint value,如果第一個字符的值小于第二個,則在排序結果中第一個會在前面,反之亦然。

    1. java.text.Collator
    接口及其實現類


    其實 java 中提供了和語言相關的類,即 Collator 接口及其實現類。

     是一個具體類,它實現了 Comparator 接口中的 compare(Object, Object) 方法。 RuleBasedCollator 根據根據特定語言的默認規則比較字符,也可以按照指定的規則來比較,請參閱 java API 獲取此類的詳細信 息。
    如果我們需要對一個有中文的數組進行排序,則可以使用這個類。請看如下示例代碼:

    1. import  java.util.*;
    2. import  java.text.*;
    3. public  class  Test
    4. {
    5.         String  [] test = new  String [] {
    6.                 "作業" ,
    7.                 "測試" ,
    8.                 "test" ,
    9.                 "我們" ,
    10.                 "。空" ,
    11.                 "鏤空" ,
    12.                 "[" ,
    13.                 "瀏" ,
    14.                 "皙"
    15.         };
    16.       java.util.Arrays .sort(test, 
    17.               (RuleBasedCollator )Collator .getInstance(Locale .CHINA));
    18.       System .out.println("============" );
    19.       for (String  key : test)
    20.           System .out.println(key);
    21. }



    以上代碼的輸出結果為:

    ============
    [
    test
    。空
    測試
    我們
    作業

    鏤空



    大家可能會發現只有一部分漢字是按照漢語拼音排序了,還有幾個沒有。

    問題分析:


    GB2312:
    在簡體中文中我們使用比較多的字符集是 GB2312-80,簡稱為 GB2312,這個字符集包含了目前最常用的漢字共計 6736 個。其中的漢字分為兩大類:

      常用漢字

     

      次常用漢字



    常用漢字按照漢語拼音來排序,而次常用漢字按照筆畫部首進行排序。

    簡體漢字在 Unicode 中一般是按照 gb2312 的碼點值的順序來放置的,所以如果是常用漢字 java 就能夠很準確的進行排序,但如果是次常用漢字,則就會出現問題。在以上示例中,"鏤","皙" 屬于次常用字。

    解決方案:


    RuleBasedCollator 類 getRules() 方法可以返回對應語言的規則設置。簡體中文對應的規則是 gb2312 所對應的字符。


      我們可以把其中的全部漢字提取出來

     

      對這些漢字重新排序

     

      利用RuleBasedCollator(String rules) 構造器新建一個定制的 RuleBasedCollator

     

    參考代碼


    在以下的代碼中,我把排過序的漢字直接作為 String 對象放在類里面了,如果要讓代碼變得簡潔一些,則可以把完整的規則(特殊字符+排序漢字)存為文件。

    1. package  sorting;
    2. import  java.util.*;
    3. import  java.text.*;
    4. /**
    5.  * @author GaoJianMin
    6.  *
    7.  */
    8. public  class  ChineseGB2312Collator
    9. {
    10.     /**
    11.      * @return a customized RuleBasedCollator with Chinese characters (GB2312) sorted correctly
    12.      * 
    13.      */
    14.     public  static  final  RuleBasedCollator  getFixedGB2312Collator()
    15.     {
    16.         RuleBasedCollator  fixedGB2312Collator =null ;
    17.         try
    18.         {
    19.             fixedGB2312Collator = new  java.text.RuleBasedCollator (
    20.                     ChineseGB2312Collator.getGB2312SpecialChars() +
    21.                     GB2312Chars
    22.                     );
    23.         }catch (ParseException  e)
    24.         {
    25.             e.printStackTrace();
    26.         }
    27.         return  fixedGB2312Collator;
    28.     }
    29.     
    30.     /**
    31.      * @return the special characters in GB2312 charset.
    32.      * 
    33.      */
    34.     public  static  final  String  getGB2312SpecialChars()
    35.     {
    36.         RuleBasedCollator  zh_CNCollator = (RuleBasedCollator )Collator .getInstance(Locale .CHINA);
    37.         //index 2125 is the last symbol "╋"
    38.         return  zh_CNCollator.getRules().substring(0,2125);
    39.     }
    40.     
    41.     /**
    42.      * 6763 Chinese characters in GB2312 charset
    43.      */
    44.     public  static  final  String  GB2312Chars =
    45.         "<吖<阿<啊< 錒<嗄<哎<哀<唉<埃<挨<锿<捱<皚<癌<噯<矮<藹< 靄<艾<愛<砹<隘<嗌<嬡<礙<曖<璦<安<桉<氨<庵< 諳<鵪<鞍<俺<埯<銨<揞<犴<岸<按<案<胺<暗<黯< 骯<昂<盎<凹<坳<敖<嗷<廒<獒<遨<熬<翱<聱<螯< 鰲<鏖<拗<襖<媼<岙<傲<奧<驁<澳<懊<鏊"  +
    46.         "<八<巴<叭< 扒<吧<岜<芭<疤<捌<笆<粑<拔<茇<菝<跋<魃<把< 鈀<靶<壩<爸<罷<鲅<霸<灞<掰<白<百<佰<柏<捭< 擺<唄<敗<拜<稗<扳<班<般<頒<斑<搬<瘢<癍<阪< 坂<板<版<鈑<舨<辦<半<伴<扮<拌<絆<瓣<邦<幫< 梆<浜<綁<榜<膀<蚌<傍<棒<謗<蒡<磅<鎊<勹<包< 孢<苞<胞<煲<齙<褒<雹<寶<飽<保<鴇<堡<葆<褓< 報<抱<豹<趵<鮑<暴<爆<陂<卑<杯<悲<碑<鵯<北< 貝<狽<邶<備<背<鋇<倍<悖<被<憊<焙<輩<碚<蓓< 褙<鞴<鐾<奔<賁<錛<本<苯<畚<坌<笨<崩<繃<嘣< 甭<泵<迸<甏<蹦<逼<荸<鼻<匕<比<吡<妣<彼<秕< 俾<筆<舭<鄙<幣<必<畢<閉<庇<畀<嗶<毖<蓽<陛< 斃<狴<鉍<婢<庳<敝<萆<弼<愎<篳<潷<痹<蓖<裨< 蹕<辟<弊<碧<箅<蔽<壁<嬖<篦<薜<避<濞<臂<髀< 璧<襞<邊<砭<籩<編<煸<蝙<鳊<鞭<貶<扁<窆<匾< 碥<褊<卞<弁<忭<汴<芐<拚<便<變<緶<遍<辨<辯< 辮<灬<杓<彪<標<颮<髟<驃<膘<瘭<鏢<飆<飚<鑣< 表<婊<裱<鰾<憋<鱉<別<蹩<癟<賓<彬<儐<斌<濱< 繽<檳<鑌<瀕<豳<擯<殯<臏<髕<鬢<冫<冰<兵<丙< 邴<秉<柄<炳<餅<稟<并<病<摒<撥<波<玻<剝<缽< 餑<啵<脖<菠<播<伯<孛<駁<帛<泊<勃<亳<鈸<鉑< 舶<博<渤<鵓<搏<箔<膊<踣<薄<礴<跛<簸<擘<檗< 逋<鈽<晡<醭<卜<卟<補<哺<捕<不<布<步<怖<钚< 部<埠<瓿<簿"  ;
    1. }
    2. package  sorting;
    3. import  java.util.*;
    4. import  java.text.*;
    5. /**
    6.  * @author GaoJianMin
    7.  *
    8.  */
    9. public  class  ChineseGB2312Comparator implements  Comparator <String >, Comparable <String > {
    10.     private  RuleBasedCollator  GB2312Collator =
    11.         ChineseGB2312Collator.getFixedGB2312Collator();
    12.     private  String  str1;
    13.     
    14.     /**
    15.      * @param str1
    16.      */
    17.     public  ChineseGB2312Comparator(String  str1) {
    18.         this .str1 = str1;
    19.     }
    20.     /**
    21.      * 
    22.      */
    23.     public  ChineseGB2312Comparator() {
    24.         this .str1="" ;
    25.     }
    26.     /**
    27.      * @param str1
    28.      * @param str2
    29.      * @return an integer indicatint the comparison result
    30.      * @see java.util.Comparator#compare(Object, Object)
    31.      */
    32.     public  int  compare(String  str1, String  str2) {
    33.         return  GB2312Collator.compare(str1, str2);
    34.     }
    35.     /**
    36.      * @param str2
    37.      * @return an integer indicatint the comparison result
    38.      *  @see java.lang.Comparable#compareTo(Object)
    39.      */
    40.     public  int  compareTo(String  str2) {
    41.         return  GB2312Collator.compare(str1, str2);
    42.     }
    43. }


    測試代碼及結果


    代碼:
    1. import  java.util.*;
    2. import  java.text.*;
    3. public  class  Test
    4. {
    5.         String  [] test = new  String [] {
    6.                 "作業" ,
    7.                 "測試" ,
    8.                 "test" ,
    9.                 "我們" ,
    10.                 "。空" ,
    11.                 "鏤空" ,
    12.                 "[" ,
    13.                 "瀏" ,
    14.                 "皙"
    15.         };
    16.       java.util.Arrays .sort(test, new  ChineseGB2312Comparator());
    17.       System .out.println("============" );
    18.       for (String  key : test)
    19.           System .out.println(key);
    20. }


    ChineseGB2312Comparator 類同時實現了 Comparator, Comparable 接口,這樣以后能夠使用 compare, compareTo 方法的時候都可以使用這個類。
    posted on 2010-12-17 13:22 小菜毛毛 閱讀(9339) 評論(2)  編輯  收藏 所屬分類: java基礎運用面試

    Feedback

    # re: java中文漢字排序 2013-09-18 12:18 2
    44  回復  更多評論
      

    # re: java中文漢字排序 2015-05-29 14:17 頂頂頂
    環境的鳳凰健康更換即可   回復  更多評論
      

    主站蜘蛛池模板: 亚洲国产成人精品无码区花野真一| 亚洲精品中文字幕| 最近国语视频在线观看免费播放| 亚洲福利精品一区二区三区| 亚洲人成电影网站免费| 免费毛片在线视频| 另类专区另类专区亚洲| 亚洲第一黄色网址| 国产精品免费观看视频| 亚洲精品国偷自产在线| 人妻丰满熟妇无码区免费 | 亚洲午夜爱爱香蕉片| 成年免费a级毛片| 在线日韩日本国产亚洲| 免费观看成人久久网免费观看| 亚洲国产精品无码久久久秋霞2| 亚洲精品免费观看| 亚洲另类视频在线观看| 高清国语自产拍免费视频国产| 理论片在线观看免费| 国产亚洲成AV人片在线观黄桃| 久久久久免费看黄a级试看| 亚洲伊人久久大香线蕉啊| 永久免费观看的毛片的网站| 一区二区三区免费看| 97se亚洲综合在线| 在线看片人成视频免费无遮挡| 美女被吸屁股免费网站| 亚洲AV日韩AV天堂一区二区三区| 中文毛片无遮挡高潮免费| 在线观看亚洲专区| 久久精品国产亚洲av高清漫画| 午夜dj免费在线观看| 久久av免费天堂小草播放| 亚洲日韩中文字幕天堂不卡| 国产免费一区二区三区VR| 一级毛片**不卡免费播| 亚洲AV色欲色欲WWW| 亚洲人成网站在线播放影院在线| 无码视频免费一区二三区 | 久久亚洲私人国产精品vA|