打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Jjava中文汉字排序
// 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

  关键字: 中文排序

  概述

  我们在应用程序中可能会经常遇到对中文排序的问题,例如姓名列表,词汇表等等。对中文排序,我们使用比较多的是根据汉语拼音发音来确定顺序。

  我们可能会经常使用

  java.util.Set

  接口,

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

  等类或方法对含有中文字符的对象进行排序,但是这些在默认情况下都是调用

  String .CompareTo(String )

  方法,这个方法是比较2个字符的 codepoint value,如果第一个字符的值小于第二个,则在排序结果中第一个会在前面,反之亦然。

  java.text.Collator

  接口及其实现类

  其实 java 中提供了和语言相关的类,即 Collator 接口及其实现类。

  java.text.RuleBasedCollator

  是一个具体类,它实现了 Comparator 接口中的 compare(Object, Object) 方法。RuleBasedCollator 根据根据特定语言的默认规则比较字符,也可以按照指定的规则来比较,请参阅 java API 获取此类的详细信息。

  如果我们需要对一个有中文的数组进行排序,则可以使用这个类。请看如下示例代码:

  import java.util.*;

  import java.text.*;

  public class Test

  {

  String [] test = new String [] {

  "作业" ,

  "测试" ,

  "test" ,

  "我们" ,

  "。空" ,

  "镂空" ,

  "[" ,

  "浏" ,

  "皙"

  };
 
java.util.Arrays .sort(test,

  (RuleBasedCollator )Collator .getInstance(Locale .CHINA));

  System .out.println("============" );

  for (String key : test)

  System .out.println(key);

  }

  以上代码的输出结果为:

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

  [

  test

  。空

  测试

  我们

  作业

  浏

  镂空

  皙

  大家可能会发现只有一部分汉字是按照汉语拼音排序了,还有几个没有。

  问题分析:

  GB2312:

  在简体中文中我们使用比较多的字符集是 GB2312-80,简称为 GB2312,这个字符集包含了目前最常用的汉字共计 6736 个。其中的汉字分为两大类:

  常用汉字

  次常用汉字

  常用汉字按照汉语拼音来排序,而次常用汉字按照笔画部首进行排序。

  简体汉字在 Unicode 中一般是按照 gb2312 的码点值的顺序来放置的,所以如果是常用汉字 java 就能够很准确的进行排序,但如果是次常用汉字,则就会出现问题。在以上示例中,"镂","皙" 属于次常用字。来源:考试网IT学院

  解决方案:

  RuleBasedCollator 类 getRules() 方法可以返回对应语言的规则设置。简体中文对应的规则是 gb2312 所对应的字符。

  我们可以把其中的全部汉字提取出来

  对这些汉字重新排序

  利用RuleBasedCollator(String rules) 构造器新建一个定制的 RuleBasedCollator

  参考代码

  在以下的代码中,我把排过序的汉字直接作为 String 对象放在类里面了,如果要让代码变得简洁一些,则可以把完整的规则(特殊字符+排序汉字)存为文件。

  package sorting;

  import java.util.*;

  import java.text.*;

  /**

  * @author GaoJianMin

  *

  */

  public class ChineseGB2312Collator

  {

  /**

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

  *

  */

  public static final RuleBasedCollator getFixedGB2312Collator()

  {

  RuleBasedCollator fixedGB2312Collator =null
 
try

  {

  fixedGB2312Collator = new java.text.RuleBasedCollator (

  ChineseGB2312Collator.getGB2312SpecialChars() +

  GB2312Chars

  );

  }catch (ParseException e)

  {

  e.printStackTrace();

  }

  return fixedGB2312Collator;

  }

  /**

  * @return the special characters in GB2312 charset.

  *

  */

  public static final String getGB2312SpecialChars()

  {

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

  //index 2125 is the last symbol "╋"

  return zh_CNCollator.getRules().substring(0,2125);

  }

  /**

  * 6763 Chinese characters in GB2312 charset

  */

  public static final String GB2312Chars =

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

  "<八<巴<叭<扒<吧<岜<芭<疤<捌<笆<粑<拔< 茇<菝<跋<魃<把<钯<靶<坝<爸<罢<鲅<霸<灞<掰< 白<百<佰<柏<捭<摆<呗<败<拜<稗<扳<班<般<颁< 斑<搬<瘢<癍<阪<坂<板<版<钣<舨<办<半<伴<扮< 拌<绊<瓣<邦<帮<梆<浜<绑<榜<膀<蚌<傍<棒<谤< 蒡<磅<镑<勹<包<孢<苞<胞<煲<龅<褒<雹<宝<饱< 保<鸨<堡<葆<褓<报<抱<豹<趵<鲍<暴<爆<陂<卑< 杯<悲<碑<鹎<北<贝<狈<邶<备<背<钡<倍<悖<被< 惫<焙<辈<碚<蓓<褙<鞴<鐾<奔<贲<锛<本<苯<畚< 坌<笨<崩<绷<嘣<甭<泵<迸<甏<蹦<逼<荸<鼻<匕< 比<吡<妣<彼<秕<俾<笔<舭<鄙<币<必<毕<闭<庇< 畀<哔<毖<荜<陛<毙<狴<铋<婢<庳<敝<萆<弼<愎< 筚<滗<痹<蓖<裨<跸<辟<弊<碧<箅<蔽<壁<嬖<篦< 薜<避<濞<臂<髀<璧<襞<边<砭<笾<编<煸<蝙<鳊< 鞭<贬<扁<窆<匾<碥<褊<卞<弁<忭<汴<苄<拚<便< 变<缏<遍<辨<辩<辫<灬<杓<彪<标<飑<髟<骠<膘< 瘭<镖<飙<飚<镳<表<婊<裱<鳔<憋<鳖<别<蹩<瘪< 宾<彬<傧<斌<滨<缤<槟<镔<濒<豳<摈<殡<膑<髌< 鬓<冫<冰<兵<丙<邴<秉<柄<炳<饼<禀<并<病<摒< 拨<波<玻<剥<钵<饽<啵<脖<菠<播<伯<孛<驳<帛< 泊<勃<亳<钹<铂<舶<博<渤<鹁<搏<箔<膊<踣<薄< 礴<跛<簸<擘<檗<逋<钸<晡<醭<卜<卟<补<哺<捕< 不<布<步<怖<钚<部<埠<瓿<簿" ;

  }

  package sorting;

  import java.util.*;

  import java.text.*;

  /**

  * @author GaoJianMin

  *

  */

  public class ChineseGB2312Comparator implements Comparator <String >, Comparable <String > {

  private RuleBasedCollator GB2312Collator =

  ChineseGB2312Collator.getFixedGB2312Collator();

  private String str1;

  /**

  * @param str1

  */
 
public ChineseGB2312Comparator(String str1) {

  this .str1 = str1;

  }

  /**

  *

  */

  public ChineseGB2312Comparator() {

  this .str1="" ;

  }

  /**

  * @param str1

  * @param str2

  * @return an integer indicatint the comparison result

  * @see java.util.Comparator#compare(Object, Object)

  */

  public int compare(String str1, String str2) {

  return GB2312Collator.compare(str1, str2);

  }

  /**

  * @param str2

  * @return an integer indicatint the comparison result

  *   @see java.lang.Comparable#compareTo(Object)

  */

  public int compareTo(String str2) {

  return GB2312Collator.compare(str1, str2);

  }

  }

  测试代码及结果

  代码:

  import java.util.*;

  import java.text.*;

  public class Test

  {

  String [] test = new String [] {

  "作业" ,

  "测试" ,

  "test" ,

  "我们" ,

  "。空" ,

  "镂空" ,

  "[" ,

  "浏" ,

  "皙"

  };

  java.util.Arrays .sort(test, new ChineseGB2312Comparator());

  System .out.println("============" );

  for (String key : test)

  System .out.println(key);

  }

  ChineseGB2312Comparator 类同时实现了 Comparator, Comparable 接口,这样以后能够使用 compare, compareTo 方法的时候都可以使用这个类。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
JR 精品文章 - Java实现中文排序
java中文排序.
list与String的相互转换(Java8)
java判断string字符串中是否存在汉字
java byte 数据类型
java中new String(str.getBytes(“gbk”),“gbk”)用法详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服