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

我们可能会经常使用

  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 获取此类的详细信 息。

以上代码的输出结果为:

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

[

test

。空

测试

我们

作业

镂空

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

问题分析:

GB2312:

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

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

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

解决方案:

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

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

  1. 对这些汉字重新排序

  1. 利用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 =

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

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

}

怎么对项目编号排序(整理关于项目里面中文数据排序问题解决方案)(1)

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);

}

}

怎么对项目编号排序(整理关于项目里面中文数据排序问题解决方案)(2)

测试代码及结果

代码:

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);

}

请大家多度关注我的头条号,谢谢大家!

,