一、Java比较汉字

// 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 接口及其实现类。

  1. java.text.RuleBasedCollator

是一个具体类,它实现了 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 所对应的字符。

  1. 我们可以把其中的全部汉字提取出来
  1. 对这些汉字重新排序
  1. 利用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.      * @return the special characters in GB2312 charset.
  31.      * 
  32.      */
  33. public  static  final  String  getGB2312SpecialChars()
  34. {
  35. RuleBasedCollator  zh_CNCollator = (RuleBasedCollator )Collator .getInstance(Locale .CHINA);
  36. //index 2125 is the last symbol "╋"
  37. return  zh_CNCollator.getRules().substring(0,2125);
  38. }
  39. /**
  40.      * 6763 Chinese characters in GB2312 charset
  41.      */
  42. public  static  final  String  GB2312Chars =
  43. "<吖<阿<啊< 锕<嗄<哎<哀<唉<埃<挨<锿<捱<皑<癌<嗳<矮<蔼< 霭<艾<爱<砹<隘<嗌<嫒<碍<暧<瑷<安<桉<氨<庵< 谙<鹌<鞍<俺<埯<铵<揞<犴<岸<按<案<胺<暗<黯< 肮<昂<盎<凹<坳<敖<嗷<廒<獒<遨<熬<翱<聱<螯< 鳌<鏖<拗<袄<媪<岙<傲<奥<骜<澳<懊<鏊"  +
  44. "<八<巴<叭< 扒<吧<岜<芭<疤<捌<笆<粑<拔<茇<菝<跋<魃<把< 钯<靶<坝<爸<罢<鲅<霸<灞<掰<白<百<佰<柏<捭< 摆<呗<败<拜<稗<扳<班<般<颁<斑<搬<瘢<癍<阪< 坂<板<版<钣<舨<办<半<伴<扮<拌<绊<瓣<邦<帮< 梆<浜<绑<榜<膀<蚌<傍<棒<谤<蒡<磅<镑<勹<包< 孢<苞<胞<煲<龅<褒<雹<宝<饱<保<鸨<堡<葆<褓< 报<抱<豹<趵<鲍<暴<爆<陂<卑<杯<悲<碑<鹎<北< 贝<狈<邶<备<背<钡<倍<悖<被<惫<焙<辈<碚<蓓< 褙<鞴<鐾<奔<贲<锛<本<苯<畚<坌<笨<崩<绷<嘣< 甭<泵<迸<甏<蹦<逼<荸<鼻<匕<比<吡<妣<彼<秕< 俾<笔<舭<鄙<币<必<毕<闭<庇<畀<哔<毖<荜<陛< 毙<狴<铋<婢<庳<敝<萆<弼<愎<筚<滗<痹<蓖<裨< 跸<辟<弊<碧<箅<蔽<壁<嬖<篦<薜<避<濞<臂<髀< 璧<襞<边<砭<笾<编<煸<蝙<鳊<鞭<贬<扁<窆<匾< 碥<褊<卞<弁<忭<汴<苄<拚<便<变<缏<遍<辨<辩< 辫<灬<杓<彪<标<飑<髟<骠<膘<瘭<镖<飙<飚<镳< 表<婊<裱<鳔<憋<鳖<别<蹩<瘪<宾<彬<傧<斌<滨< 缤<槟<镔<濒<豳<摈<殡<膑<髌<鬓<冫<冰<兵<丙< 邴<秉<柄<炳<饼<禀<并<病<摒<拨<波<玻<剥<钵< 饽<啵<脖<菠<播<伯<孛<驳<帛<泊<勃<亳<钹<铂< 舶<博<渤<鹁<搏<箔<膊<踣<薄<礴<跛<簸<擘<檗< 逋<钸<晡<醭<卜<卟<补<哺<捕<不<布<步<怖<钚< 部<埠<瓿<簿"  ;
  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.      * @param str1
  15.      */
  16. public  ChineseGB2312Comparator(String  str1) {
  17. this .str1 = str1;
  18. }
  19. /**
  20.      * 
  21.      */
  22. public  ChineseGB2312Comparator() {
  23. this .str1="" ;
  24. }
  25. /**
  26.      * @param str1
  27.      * @param str2
  28.      * @return an integer indicatint the comparison result
  29.      * @see java.util.Comparator#compare(Object, Object)
  30.      */
  31. public  int  compare(String  str1, String  str2) {
  32. return  GB2312Collator.compare(str1, str2);
  33. }
  34. /**
  35.      * @param str2
  36.      * @return an integer indicatint the comparison result
  37.      *  @see java.lang.Comparable#compareTo(Object)
  38.      */
  39. public  int  compareTo(String  str2) {
  40. return  GB2312Collator.compare(str1, str2);
  41. }
  42. }

测试代码及结果

代码:

  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 方法的时候都可以使用这个类。

二、VC++比较汉字
[别名]
CompareStringA
[说明]
根据用于特定“地方”环境的文本对比设置,对两个字串进行比较
[参数表]
LocaleLong,比较进行时的一个“地方”标识符
dwCmpFlagsLong,带 NORM_??? 前缀的一个或多个常数,它们定义了象“忽略大小写”这样的一些选项
lpString1String,要比较的第一个字串
cchCount1Long,以字节为单位指定字串长度(如果是DBCS字串,则没有字符)。如设为-1,表示进行自动计算(以NULL中止字符为准)
lpString2String,要比较的第二个字串
cchCount2Long,第二个字串的长度(参考 cchCount1 参数说明)
[返回值]
Long,如lpString1<lpString2,返回1;如相等,返回2;如lpString1>lpString2,则返回3。会设置GetLastError
[其它]
这个函数进行的比较要以特定的语言环境为基础,并不严格按照字符值进行比较

Java比较汉字字符串排序与C++比较汉字排序相关推荐

  1. 怎么比较字符串java_如何在Java中比较字符串?

    在本文中,优锐课将带你学习如何比较字符串以及使用等于(=)运算符比较字符串时发生的问题. 介绍 字符串是Java中的特殊类.我们在Java程序中定期使用String,因此比较两个字符串是Java中的一 ...

  2. 提取文本中的汉字字符串

    java 编程点滴 提取文本中的汉字字符串 提取文本中的汉字字符串 代码中含有中文字符,希望将代码中的中文字符提取出来,输出到数据库表格,然后补充对应的英文翻译. 继续处理代码,将文中的中文字符,通过 ...

  3. 使用正则表达式匹配汉字字符串

    使用正则表达式匹配汉字字符串: 1.一个汉字:[\u4E00-\u9FA5] 2.多个汉字,包括空格:[\u4E00-\u9FA5\\s]+ 3.多个汉字,不包括空格:[\u4E00-\u9FA5]+ ...

  4. Java比较、排序处理含有中文/汉字的字符串

    目录 引言 一.方案一 1.依赖引入 2.完整代码(含注解) 3.验证测试 测试 isHanZi() 测试 compareCharWithHanZi() 测试 compareStringWithHan ...

  5. Android/Java汉字转拼音类及按A-Z排序方法

    在Android / java 开发中有时需要对数据进行根据拼音[A-Z]的规则进行排序所以需要先将汉字转为拼音然后再进行排序 //汉字转拼音类 package xyz.sort; import ja ...

  6. java 汉字 字母_JAVA获取中文汉字字符串拼音首字母,英文字符不变的工具类

    java在处理项目需求时,有时需要排序,尤其是中文名字按0-9,A-Z进行首字母排序,这时候就需要首先要得到中文字符串的首字母,然后按照字母顺序进行排序,不多说,直接上代码,看java如何获取中文字符 ...

  7. [转载] 【Java】将一个字符串的字符排序,按ASCII表的顺序从小到大

    参考链接: 在Java中搜索字符串中的字符和子字符串 将一个字符串的字符按ASCII表的顺序从小到大排序,如将字符串"asdafxcvMADb"排序为"ADMaabcdf ...

  8. java字符串转换为拼音_JAVA实现汉字转换为拼音 pinyin4j/JPinyin

    在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,比如说通讯录,就会要求按名字首字符发音排序,如果自己写实现这方面的功能是个很好大的工程,还好网上有公开的第三方jar支持转换,结合网上很多前辈的代 ...

  9. java字节字符_java按字节截取带有汉字的字符串的解法(推荐)

    由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串. 自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度 ...

  10. java截取中文_java按字节截取带有汉字的字符串的解法(推荐)

    由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串. 自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度 ...

最新文章

  1. Size Classes with Xcode 6:为所有的尺寸准备一个Storyboard
  2. php mysql操作封装_php封装MySQL数据库基本操作
  3. android base64解密,android Base64 AES加密解密
  4. 【深入Java虚拟机JVM 09】JVM垃圾回收finalize方法--对象最有一次自我拯救
  5. Sqlserver2014下载与安装
  6. js使用defineProperty的一些坑
  7. docker 中用docker 启动应用访问docker中的mysql
  8. Anaconda配置的环境里面增加第三方库的方法
  9. 关于angular开发中报错Cannot find module ‘webpack/lib/node/NodeTemplatePlugin‘问题的解决办法若干
  10. 桶排序,冒泡排序,快速排序三者比较(例子说名)
  11. 基于京东家电商品知识图谱的自动问答系统(二) -- IDEA搭建开发环境
  12. python语法学习第九天--else和with语句
  13. iPhone升级iOS 15卡在请求更新上怎么办?
  14. 关于Qt的无边框窗口移动
  15. 使用代理服务器网速会变慢吗?
  16. ps怎么把黑白照片变成彩色?ps把儿童黑白照变彩色教程
  17. Promise.all、Promise.race、Promise.allSettled、Promise.any区别
  18. 国外计算机科学英语演讲,华工学子英语演讲共庆祖国华诞
  19. Pygame实战:据说这是史上最难扫雷游戏,没有之一,你们感受下......
  20. 斗鱼虎牙合并之后,平台背后的程序员将何去何从?

热门文章

  1. 关于Kernel的一点解释
  2. 使用IDEA+maven配置SSM项目步骤,以及配置项目过程中遇到的各种坑(SSM配置文件加载问题,使用注解开发问题,maven开发SSM项目步骤)
  3. 将ibd恢复进数据库
  4. Fiddler工具的弱网模拟2G/3G/4G
  5. 字节终面只问了1个框架问题,我被录取了!
  6. 合肥工业大学宣城校区计算机组成原理实验 单周期 CPU 设计与实现
  7. 记录自己考研二战失败后找工作的经历
  8. Java基础(数组)对象数组通过下标找出对象的最大值
  9. 成双成对的数,怎么找到落单的那个
  10. Ubuntu的软件包管理 || 软硬链接 ||进线程浅述