熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Jjava中文漢字排序

2013-11-23 18:45:53  來源: Java核心技術 

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

  Comparator cmp = CollatorgetInstance(javautilLocaleCHINA);

  TreeMap tree=new TreeMap(cmp);

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

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

  Arrayssort(arr cmp);

  for (int i = ; i < arrlength; i++)

  Systemoutprintln(arr[i]);

  <script>

  names = [張三 李四 王五 劉六];

  namessort(function(ab){return alocaleCompare(b)});//ab 為數組a的某兩個值自動傳入

  alert(names);

  </script>

  另:

  示例文本

  String [] test = new String[] {

  作業

  測試

  test

  我們

  

  镂空

  [

  

  

  };

  jdk 版本

  

  開發平台

  Eclipse

  關鍵字 中文排序

  概述

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

  我們可能會經常使用

  javautilSet

  接口

  javautilArrays sort((T[] a Comparator <? super T> c))

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

  String CompareTo(String )

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

  javatextCollator

  接口及其實現類

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

  javatextRuleBasedCollator

  是一個具體類它實現了 Comparator 接口中的 compare(Object Object) 方法RuleBasedCollator 根據根據特定語言的默認規則比較字符也可以按照指定的規則來比較請參閱 java API 獲取此類的詳細信息

  如果我們需要對一個有中文的數組進行排序則可以使用這個類請看如下示例代碼

  import javautil*;

  import javatext*;

  public class Test

  {

  String [] test = new String [] {

  作業

  測試

  test

  我們

  

  镂空

  [

  

  

  };

  javautilArrays sort(test

  (RuleBasedCollator )Collator getInstance(Locale CHINA));

  System outprintln(============ );

  for (String key : test)

  System outprintln(key);

  }

  以上代碼的輸出結果為

  ============

  [

  test

  

  測試

  我們

  作業

  浏

  镂空

  皙

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

  問題分析

  GB:

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

  常用漢字

  次常用漢字

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

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

  解決方案

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

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

  對這些漢字重新排序

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

  參考代碼

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

  package sorting;

  import javautil*;

  import javatext*;

  /**

  * @author GaoJianMin

  *

  */

  public class ChineseGBCollator

  {

  /**

  * @return a customized RuleBasedCollator with Chinese characters (GB) sorted correctly

  *

  */

  public static final RuleBasedCollator getFixedGBCollator()

  {

  RuleBasedCollator fixedGBCollator =null ;

  try

  {

  fixedGBCollator = new javatextRuleBasedCollator (

  ChineseGBCollatorgetGBSpecialChars() +

  GBChars

  );

  }catch (ParseException e)

  {

  eprintStackTrace();

  }

  return fixedGBCollator;

  }

  /**

  * @return the special characters in GB charset

  *

  */

  public static final String getGBSpecialChars()

  {

  RuleBasedCollator zh_CNCollator = (RuleBasedCollator )Collator getInstance(Locale CHINA);

  //index is the last symbol

  return zh_CNCollatorgetRules()substring();

  }

  /**

  * Chinese characters in GB charset

  */

  public static final String GBChars =

  <吖<阿<啊<锕<嗄<哎<哀<唉<埃<挨<锿<捱<皚<癌<嗳<矮<藹<霭<艾<愛<砹<隘<嗌<嫒<礙<暧<瑷<安<桉<氨<庵<谙<鹌<鞍<俺<埯<铵<揞<犴<岸<按<案<胺<暗<黯<骯<昂<盎<凹<坳<敖<嗷<廒<獒<遨<熬<翱<聱<螯<鳌<鏖<拗<襖<媪<岙<傲<奧<骜<澳<懊<鏊 +

  <八<巴<叭<扒<吧<岜<芭<疤<捌<笆<粑<拔<茇<菝<跋<魃<把<钯<靶<壩<爸<罷<鲅<霸<灞<掰<白<百<佰<柏<捭<擺<呗<敗<拜<稗<扳<班<般<頒<斑<搬<瘢<癍<阪<坂<板<版<钣<舨<辦<半<伴<扮<拌<絆<瓣<邦<幫<梆<浜<綁<榜<膀<蚌<傍<棒<謗<蒡<磅<鎊<勹<包<孢<苞<胞<煲<龅<褒<雹<寶<飽<保<鸨<堡<葆<褓<報<抱<豹<趵<鮑<暴<爆<陂<卑<杯<悲<碑<鹎<北<貝<狽<邶<備<背<鋇<倍<悖<被<憊<焙<輩<碚<蓓<褙<鞴<鐾<奔<贲<锛<本<苯<畚<坌<笨<崩<繃<嘣<甭<泵<迸<甏<蹦<逼<荸<鼻<匕<比<吡<妣<彼<秕<俾<筆<舭<鄙<幣<必<畢<閉<庇<畀<哔<毖<荜<陛<斃<狴<铋<婢<庳<敝<萆<弼<愎<筚<滗<痺<蓖<裨<跸<辟<弊<碧<箅<蔽<壁<嬖<篦<薜<避<濞<臂<髀<璧<襞<邊<砭<笾<編<煸<蝙<鳊<鞭<貶<扁<窆<匾<碥<褊<卞<弁<忭<汴<苄<拚<便<變<缏<遍<辨<辯<辮<灬<杓<彪<標<飑<髟<骠<膘<瘭<镖<飙<飚<镳<表<婊<裱<鳔<憋<鱉<別<蹩<癟<賓<彬<傧<斌<濱<缤<槟<镔<瀕<豳<擯<殡<膑<髌<鬓<冫<冰<兵<丙<邴<秉<柄<炳<餅<禀<並<病<摒<撥<波<玻<剝<缽<饽<啵<脖<菠<播<伯<孛<駁<帛<泊<勃<亳<钹<鉑<舶<博<渤<鹁<搏<箔<膊<踣<薄<礴<跛<簸<擘<檗<逋<钸<晡<醭<卜<卟<補<哺<捕<不<布<步<怖<钚<部<埠<瓿<簿 ;

  }

  package sorting;

  import javautil*;

  import javatext*;

  /**

  * @author GaoJianMin

  *

  */

  public class ChineseGBComparator implements Comparator <String > Comparable <String > {

  private RuleBasedCollator GBCollator =

  ChineseGBCollatorgetFixedGBCollator();

  private String str;

  /**

  * @param str

  */

  public ChineseGBComparator(String str) {

  this str = str;

  }

  /**

  *

  */

  public ChineseGBComparator() {

  this str= ;

  }

  /**

  * @param str

  * @param str

  * @return an integer indicatint the comparison result

  * @see javautilComparator#compare(Object Object)

  */

  public int compare(String str String str) {

  return pare(str str);

  }

  /**

  * @param str

  * @return an integer indicatint the comparison result

  *   @see javalangComparable#compareTo(Object)

  */

  public int compareTo(String str) {

  return pare(str str);

  }

  }

  測試代碼及結果

  代碼

  import javautil*;

  import javatext*;

  public class Test

  {

  String [] test = new String [] {

  作業

  測試

  test

  我們

  

  镂空

  [

  

  

  };

  javautilArrays sort(test new ChineseGBComparator());

  System outprintln(============ );

  for (String key : test)

  System outprintln(key);

  }

  ChineseGBComparator 類同時實現了 Comparator Comparable 接口這樣以後能夠使用 compare compareTo 方法的時候都可以使用這個類


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25680.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.