Java中文汉字排序.docx
- 文档编号:6325273
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:8
- 大小:18.66KB
Java中文汉字排序.docx
《Java中文汉字排序.docx》由会员分享,可在线阅读,更多相关《Java中文汉字排序.docx(8页珍藏版)》请在冰豆网上搜索。
Java中文汉字排序
//Collator类是用来执行区分语言环境的String比较的,这里选择使用CHINA
Comparatorcmp=Collator.getInstance(java.util.Locale.CHINA);
TreeMaptree=newTreeMap(cmp);
String[]arr={"张三","李四","王五"};
//使根据指定比较器产生的顺序对指定对象数组进行排序。
Arrays.sort(arr,cmp);
for(inti=0;i System.out.println(arr[i]); names=["张三","李四","王五","刘六"]; names.sort(function(a,b){returna.localeCompare(b)});//a,b为数组a的某两个值,自动传入 alert(names); 另: 示例文本: String[]test=newString[]{ "作业", "测试", "test", "我们", "。 空", "镂空", "[", "浏", "皙" }; jdk版本: 1.5.6 开发平台: Eclipse3.1 关键字: 中文排序 概述 我们在应用程序中可能会经常遇到对中文排序的问题,例如姓名列表,词汇表等等。 对中文排序,我们使用比较多的是根据汉语拼音发音来确定顺序。 我们可能会经常使用 java.util.Set 接口, java.util.Arrays.sort((T[]a,Comparator superT>c)) 等类或方法对含有中文字符的对象进行排序,但是这些在默认情况下都是调用 String.CompareTo(String) 方法,这个方法是比较2个字符的codepointvalue,如果第一个字符的值小于第二个,则在排序结果中第一个会在前面,反之亦然。 java.text.Collator 接口及其实现类 其实java中提供了和语言相关的类,即Collator接口及其实现类。 java.text.RuleBasedCollator 是一个具体类,它实现了Comparator接口中的compare(Object,Object)方法。 RuleBasedCollator根据根据特定语言的默认规则比较字符,也可以按照指定的规则来比较,请参阅javaAPI获取此类的详细信息。 如果我们需要对一个有中文的数组进行排序,则可以使用这个类。 请看如下示例代码: importjava.util.*; importjava.text.*; publicclassTest { String[]test=newString[]{ "作业", "测试", "test", "我们", "。 空", "镂空", "[", "浏", "皙" }; java.util.Arrays.sort(test, (RuleBasedCollator)Collator.getInstance(Locale.CHINA)); System.out.println("============"); for(Stringkey: test) System.out.println(key); } 以上代码的输出结果为: ============ [ test 。 空 测试 我们 作业 浏 镂空 皙 大家可能会发现只有一部分汉字是按照汉语拼音排序了,还有几个没有。 问题分析: GB2312: 在简体中文中我们使用比较多的字符集是GB2312-80,简称为GB2312,这个字符集包含了目前最常用的汉字共计6736个。 其中的汉字分为两大类: 常用汉字 次常用汉字 常用汉字按照汉语拼音来排序,而次常用汉字按照笔画部首进行排序。 简体汉字在Unicode中一般是按照gb2312的码点值的顺序来放置的,所以如果是常用汉字java就能够很准确的进行排序,但如果是次常用汉字,则就会出现问题。 在以上示例中,"镂","皙"属于次常用字。 解决方案: RuleBasedCollator类getRules()方法可以返回对应语言的规则设置。 简体中文对应的规则是gb2312所对应的字符。 我们可以把其中的全部汉字提取出来 对这些汉字重新排序 利用RuleBasedCollator(Stringrules)构造器新建一个定制的RuleBasedCollator 参考代码 在以下的代码中,我把排过序的汉字直接作为String对象放在类里面了,如果要让代码变得简洁一些,则可以把完整的规则(特殊字符+排序汉字)存为文件。 packagesorting; importjava.util.*; importjava.text.*; /** *@authorGaoJianMin * */ publicclassChineseGB2312Collator { /** *@returnacustomizedRuleBasedCollatorwithChinesecharacters(GB2312)sortedcorrectly * */ publicstaticfinalRuleBasedCollatorgetFixedGB2312Collator() { RuleBasedCollatorfixedGB2312Collator=null; try { fixedGB2312Collator=newjava.text.RuleBasedCollator( ChineseGB2312Collator.getGB2312SpecialChars()+ GB2312Chars ); }catch(ParseExceptione) { e.printStackTrace(); } returnfixedGB2312Collator; } /** *@returnthespecialcharactersinGB2312charset. * */ publicstaticfinalStringgetGB2312SpecialChars() { RuleBasedCollatorzh_CNCollator=(RuleBasedCollator)Collator.getInstance(Locale.CHINA); //index2125isthelastsymbol"╋" returnzh_CNCollator.getRules().substring(0,2125); } /** *6763ChinesecharactersinGB2312charset */ publicstaticfinalStringGB2312Chars= "<吖<阿<啊<锕<嗄<哎<哀<唉<埃<挨<锿<捱<皑<癌<嗳<矮<蔼<霭<艾<爱<砹<隘<嗌<嫒<碍<暧<瑷<安<桉<氨<庵<谙<鹌<鞍<俺<埯<铵<揞<犴<岸<按<案<胺<暗<黯<肮<昂<盎<凹<坳<敖<嗷<廒<獒<遨<熬<翱<聱<螯<鳌<鏖<拗<袄<媪<岙<傲<奥<骜<澳<懊<鏊"+ "<八<巴<叭<扒<吧<岜<芭<疤<捌<笆<粑<拔<茇<菝<跋<魃<把<钯<靶<坝<爸<罢<鲅<霸<灞<掰<白<百<佰<柏<捭<摆<呗<败<拜<稗<扳<班<般<颁<斑<搬<瘢<癍<阪<坂<板<版<钣<舨<办<半<伴<扮<拌<绊<瓣<邦<帮<梆<浜<绑<榜<膀<蚌<傍<棒<谤<蒡<磅<镑<勹<包<孢<苞<胞<煲<龅<褒<雹<宝<饱<保<鸨<堡<葆<褓<报<抱<豹<趵<鲍<暴<爆<陂<卑<杯<悲<碑<鹎<北<贝<狈<邶<备<背<钡<倍<悖<被<惫<焙<辈<碚<蓓<褙<鞴<鐾<奔<贲<锛<本<苯<畚<坌<笨<崩<绷<嘣<甭<泵<迸<甏<蹦<逼<荸<鼻<匕<比<吡<妣<彼<秕<俾<笔<舭<鄙<币<必<毕<闭<庇<畀<哔<毖<荜<陛<毙<狴<铋<婢<庳<敝<萆<弼<愎<筚<滗<痹<蓖<裨<跸<辟<弊<碧<箅<蔽<壁<嬖<篦<薜<避<濞<臂<髀<璧<襞<边<砭<笾<编<煸<蝙<鳊<鞭<贬<扁<窆<匾<碥<褊<卞<弁<忭<汴<苄<拚<便<变<缏<遍<辨<辩<辫<灬<杓<彪<标<飑<髟<骠<膘<瘭<镖<飙<飚<镳<表<婊<裱<鳔<憋<鳖<别<蹩<瘪<宾<彬<傧<斌<滨<缤<槟<镔<濒<豳<摈<殡<膑<髌<鬓<冫<冰<兵<丙<邴<秉<柄<炳<饼<禀<并<病<摒<拨<波<玻<剥<钵<饽<啵<脖<菠<播<伯<孛<驳<帛<泊<勃<亳<钹<铂<舶<博<渤<鹁<搏<箔<膊<踣<薄<礴<跛<簸<擘<檗<逋<钸<晡<醭<卜<卟<补<哺<捕<不<布<步<怖<钚<部<埠<瓿<簿"; } packagesorting; importjava.util.*; importjava.text.*; /** *@authorGaoJianMin * */ publicclassChineseGB2312ComparatorimplementsComparator privateRuleBasedCollatorGB2312Collator= ChineseGB2312Collator.getFixedGB2312Collator(); privateStringstr1; /** *@paramstr1 */ publicChineseGB2312Comparator(Stringstr1){ this.str1=str1; } /** * */ publicChineseGB2312Comparator(){ this.str1=""; } /** *@paramstr1 *@paramstr2 *@returnanintegerindicatintthecomparisonresult *@seejava.util.Comparator#compare(Object,Object) */ publicintcompare(Stringstr1,Stringstr2){ returnGB2312Cpare(str1,str2); } /** *@paramstr2 *@returnanintegerindicatintthecomparisonresult * @seejava.lang.Comparable#compareTo(Object) */ publicintcompareTo(Stringstr2){ returnGB2312Cpare(str1,str2); } } 测试代码及结果 代码: importjava.util.*; importjava.text.*; publicclassTest { String[]test=newString[]{ "作业", "测试", "test", "我们", "。 空", "镂空", "[", "浏", "皙" }; java.util.Arrays.sort(test,newChineseGB2312Comparator()); System.out.println("============"); for(Stringkey: test) System.out.println(key); } ChineseGB2312Comparator类同时实现了Comparator,Comparable接口,这样以后能够使用compare,compareTo方法的时候都可以使用这个类。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 中文 汉字 排序