概述

  我们在应用程序中可能会经常遇到对中文排序的问题,例如姓名列表,词汇表等等。对中文排序,我们使用比较多的是根据汉语拼音发音来确定顺序。
  我们可能会经常使用 java.util.Set接口,
  java.util.Arrays .sort((T[] a, Comparator <? super T> c))
  等类或方法对含有中文字符的对象进行排序,但是这些在默认情况下都是调用
  String.CompareTo(String)方法,这个方法是比较2个字符的 codepoint value,如果第一个字符的值小于第二个,则在排序结果中第一个会在前面,反之亦然。

java.text.Collator接口及其实现类其实 java 中提供了和语言相关的类,即 Collator 接口及其实现类。java.text.RuleBasedCollator是一个具体类,它实现了 Comparator 接口中的 compare(Object, Object) 方法。RuleBasedCollator 根据根据特定语言的默认规则比较字符,也可以按照指定的规则来比较,请参阅 java API 获取此类的详细信息。

import java.util.*;
import java.text.*;

public class Test {
public static void main(String[] args) {
String[] test = new String[] {"作业","测试","test","我们","。空","镂空","[","浏","皙"};
java.util.Arrays.sort(test, (RuleBasedCollator )Collator .getInstance(Locale .CHINA));

System.out.println("============");
for (String key : test)
System.out.println(key);
}
}

以上代码的输出结果为:
============
[
test
。空
测试
我们
作业

镂空

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

  问题分析:

  GB2312:

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

  常用汉字

  次常用汉字

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

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

  解决方案:

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

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

  对这些汉字重新排序

  利用RuleBasedCollator(String rules) 构造器新建一个定制的 RuleBasedCollator

  参考代码

  在以下的代码中,我把排过序的汉字直接作为 String 对象放在类里面了,如果要让代码变得简洁一些,则可以把完整的规则(特殊字符+排序汉字)存为文件。

package test.chinesesort;

import java.util.*;
import java.text.*;

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 test.chinesesort;

import java.util.*;

import java.text.*;

public class ChineseGB2312Comparator implements Comparator<String>,
Comparable<String> {

private RuleBasedCollator GB2312Collator = ChineseGB2312Collator.getFixedGB2312Collator();
private String 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);
}

}

package test.chinesesort;

import java.util.*;

import java.text.*;

public class Test {
public static void main(String[] args) {

String[] test = new String[] {"作业","测试","test","我们","。空","镂空","[","浏","皙"};

java.util.Arrays.sort(test, new ChineseGB2312Comparator());
// java.util.Arrays.sort(test, (RuleBasedCollator )Collator .getInstance(Locale .CHINA));

System.out.println("============");
for (String key : test)
System.out.println(key);
}
}

以上代码的输出结果为:
============
[
test
。空
作业
我们
测试


镂空

Java中文汉字排序相关推荐

  1. Java8对中文汉字排序的Comparator实现类

    最近由于工作需要需要对中文汉字排序,编写了Comparator实现类分享给大家. 直接上代码: import java.util.Comparator;public class ChineseComp ...

  2. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)

    这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母. 支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下 传统的 : List list = new ArrayLi ...

  3. java中文汉字按英文字母表排序

    先部署语言环境 Comparator,类型只能为Object 然后就可以排序或比较 /*** 类名称:cpm.java<br>* 类描述:汉字排序方案3<br>* 要求将汉字以 ...

  4. java中文姓名排序pinyin4j-2.5.0,pinyin4j工具类--Java 中文字符操作:排序、拼音

    直接上代码吧!将汉子转化为拼音,用到"pinyin4j-2.5.0.jar". 1.ChinaWord.java : 汉子排序 /** * @包名 :com.andy.汉字排序 * ...

  5. JAVA 中文汉字转换阿拉伯数字(最终版,已修复了亿及亿以下的汉数字的转换,超过后的数字,暂时不支持)

    嘎嘎嘎,大写的尴尬,非常感谢Eliauk_cc-May反馈的bug,代码重新修改啦,鉴于之前过于复杂的逻辑,本次进行了简化 //判断是否为中文数字字符public static List<Str ...

  6. java 中文联系人排序_通讯录之按汉字首字母排序-java

    最近开发手机端OA系统通讯录时遇到了用汉字首字母排序的问题,各种谷歌后发现了一个轮子pinyin4J,这个轮子是可以将汉字转换成字母拼音,个人觉得很好用,完美的解决了排序的问题,分享一下. 一.工具介 ...

  7. java 对 汉字排序(按照拼音字母排序)

    业务场景: 一个list集合,里面add了若干个实体类,针对该实体类排序的属性为String. 使用技术,自定义list排序(JDK自带),重写Comparator接口的compare方法,汉字转拼音 ...

  8. MySQL根据中文汉字排序查询

    在MySQL中当说到进行排序查询时,大家的第一反应就是使用 ORDER BY 方法指定列进行排序,但是如果要指定列为中文数据按照首字母排序时,就会发现 ORDER BY 方法排序的顺序其实是有问题的. ...

  9. mysql按中文汉字排序

    SELECT * FROM [表名] order by CONVERT([字段] USING gbk) https://blog.csdn.net/jay168999/article/details/ ...

最新文章

  1. 记录Flex布局的属性
  2. Async和Await如何简化异步编程几个实例
  3. python变量类型是集合_python基础-基本数据类型:集合
  4. Redis(案例四:购物车实现案例-Hash数据)
  5. Bootstrap圣诞节主题商城网站模板
  6. 一个人如果没有计划,那和咸鱼有什么区别!
  7. (转)eclipse常用插件在线安装地址或下载地址
  8. 使用反射复制一个JavaBean的对象
  9. python画数学函数_Python 绘制你想要的数学函数图形 !
  10. uvalive 3126 Taxi Cab Scheme
  11. 发言倒计时器_单面会议计时器 会议发言倒计时器
  12. 学习BMFONT的感想
  13. bat批处理的注释语句
  14. R语言系列:rgl包安装出错的解决办法
  15. Excel--查找、替换及定位
  16. 从CM刷机过程和原理分析Android系统结构
  17. 超级减肥王 V4.1.0 iPad版
  18. python笔记本电脑推荐2020_最新版:2020年适合程序员的推荐笔记本电脑
  19. 阿卜杜拉国王科技大学的计算机,阿卜杜拉国王科技大学,沙特国王大学开设专业。...
  20. 【07】函数调用:为什么会发生stack overflow?

热门文章

  1. java 中文域名转码_转换java对象
  2. L1-012. 计算指数
  3. 关于TSCnbsp;TTP243E条码打印机若干问…
  4. Python安装超详细教程
  5. 视频教程-Oracle数据库从入门到实用教程详解-Oracle
  6. 人民币大小写转换工具类
  7. 【Qt Linguist 进行中英文翻译】
  8. 设备树下的 platform 驱动开发框架
  9. 中国发射的世界首颗量子卫星“墨子号”,到底是干什么用的?
  10. 降低包装成本的 13 种简单方法