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