// 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.Arrays
.sort((T[] a, Comparator
<? super
T> c))
等类或方法对含有中文字符的对象进行排序,但是这些在默认情况下都是调用
方法,这个方法是比较2个字符的 codepoint value,如果第一个字符的值小于第二个,则在排序结果中第一个会在前面,反之亦然。
接口及其实现类
其实 java 中提供了和语言相关的类,即 Collator 接口及其实现类。
是一个具体类,它实现了 Comparator 接口中的 compare(Object, Object) 方法。
RuleBasedCollator 根据根据特定语言的默认规则比较字符,也可以按照指定的规则来比较,请参阅 java API 获取此类的详细信
息。
如果我们需要对一个有中文的数组进行排序,则可以使用这个类。请看如下示例代码:
以上代码的输出结果为:
============
[
test
。空
测试
我们
作业
浏
镂空
皙
大家可能会发现只有一部分汉字是按照汉语拼音排序了,还有几个没有。
问题分析:
GB2312:
在简体中文中我们使用比较多的字符集是 GB2312-80,简称为 GB2312,这个字符集包含了目前最常用的汉字共计 6736 个。其中的汉字分为两大类:
常用汉字按照汉语拼音来排序,而次常用汉字按照笔画部首进行排序。
简体汉字在 Unicode 中一般是按照 gb2312 的码点值的顺序来放置的,所以如果是常用汉字 java 就能够很准确的进行排序,但如果是次常用汉字,则就会出现问题。在以上示例中,"镂","皙" 属于次常用字。
解决方案:
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 方法的时候都可以使用这个类。