- 浏览: 146286 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
H4X0R:
else if(head[0]==-17 && ...
java读取txt文件乱码解决方案 -
浮生若梦dc:
ps -ef | grep java 查出所有java进程;p ...
Linux下查看指定端口占用进程号 -
浮生若梦dc:
...
jvisualvm下使用JMX方式远程监控tomcat7 -
lfl2011:
dove19900520 写道没看到你的code值是在哪用的啊 ...
java读取txt文件乱码解决方案 -
dove19900520:
没看到你的code值是在哪用的啊?
java读取txt文件乱码解决方案
概述
我们在应用程序中可能会经常遇到对中文排序的问题,例如姓名列表,词汇表等等。对中文排序,我们使用比较多的是根据汉语拼音发音来确定顺序。
我们可能会经常使用 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.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
。空
作业
我们
测试
浏
皙
镂空
发表评论
-
Tomcat项目生成文件出现文件名乱码问题
2019-09-03 17:57 8871. 本人在linux服务器的tomcat下部署一个war ... -
Java环境中编码处理
2016-11-03 11:29 0https://confluence.atlassian.co ... -
Java生成验证码
2016-05-03 13:54 0为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码 ... -
Java生成二维码
2016-05-03 11:48 0项目中用到了二维码扫描的技术,用的是Google提供的ZXi ... -
Java DelayQueue使用实例
2016-02-18 23:43 1398DelayQueue是一个支持延时获取元素的无界阻塞队列。 ... -
Java Base64 加密解密
2016-02-18 23:09 1056使用JDK的类 BASE64Decoder BASE64E ... -
类似于地区树形结构的构造
2016-01-23 20:59 922在做项目中经常会用到地区的树形结构,而在数据库中我们一般存储 ... -
VTD-XML技术解析XML实例
2015-03-27 12:01 1839VTD-XML是一种无提取的XML解析方法,它较好的解决了 ... -
Java生成短链
2015-03-04 10:50 2269生成思路: 1.将"原始链接(长链接)+ ... -
Java中字符串的应用
2014-12-12 20:54 636intern 方法 返回从字符串常量池中唯一的字 ... -
并发集合ConcurrentSkipListMap的性能测试
2014-12-10 17:47 1582ConcurrentSkipListMap是Doug ... -
AtomicInteger在多线程下的原子性测试
2014-12-10 16:18 1251使用AtomicInteger做计数器的一个例子: ... -
Java中实例方法和静态方法在多线程下加锁和不加锁的访问情况
2014-12-08 18:17 848第一个例子是同一实例方法加锁和不加锁在多线程情况下的 ... -
Java应用架构常用的框架,侧重MVC和restful应用
2014-10-21 17:24 1748Struts是采用Java Servlet/JavaSer ... -
Protocol Buffers 入门应用
2014-10-13 20:43 1595Protocol Buffers是Google开源 ... -
Eclipse反编译工具Jad.exe及插件JadClipse配置
2014-07-06 15:14 11951、下载所需文件 JadClipse,http://ja ... -
Java远程调试
2014-04-24 18:20 1036客户端Eclipse配置 服务端启动脚本 ... -
解决List的ConcurrentModificationException的几种方法
2014-04-03 19:15 1342import java.util.regex. ... -
使用Java正则表达式分析处理日志
2014-03-14 11:29 0一般的日志输出的信息有日期时间,哪个线程,执行某个任务花 ... -
Java 完美判断中文字符
2013-09-06 11:14 1487Java判断一个字符串是否有中文一般情况是利用Unicod ...
相关推荐
在Java编程语言中,对包含中文、数字和字母的数据进行排序是一项常见的任务。这个场景下,我们关注的是如何实现一个自定义的排序规则,按照数字、字母和汉字的顺序进行排列。以下是对这一主题的详细解释。 首先,...
Java汉字笔画排序是一个在中文处理领域常见的需求,特别是在数据整理、信息检索或者用户界面排序等方面。本项目提供的"java汉字笔画排序2源代码jar包"是一个优化过的解决方案,旨在减少内存占用并提高排序效率。 ...
标签进一步明确了关键概念,包括"汉字笔画排序"、"java汉字笔画排序"、"java汉字按照笔画排序"、"汉字按照笔画排序"和"中文笔画排序"。这些标签强调了该话题的特定技术点,即使用Java语言对中文字符进行笔画计数并...
Java汉字笔画排序是一种在处理汉字时按照汉字的笔画数量进行排序的技术。这个主题主要涉及到计算机科学中的数据结构和算法应用,特别是排序算法。在中文环境中,有时我们需要按照汉字的笔画数量来对汉字进行排序,这...
利用java对基本汉字(unicode编码4E00-9FA5)进行笔画排序 资源更新查看:https://blog.csdn.net/u013271384/article/details/76549368
对于一个只包含字符串的列表,我们可以直接使用 `Collections.sort()` 方法并传入 `Collator` 实例来实现中文排序。 ```java import java.util.*; import java.text.*; public class ChineseStringSort { public ...
4. * 汉字按照拼音排序的比较器 5. * @author KennyLee 2009-2-23 10:08:59 6. * 7. */ 8.public class PinyinComparator implements Comparator<Object> { 9. public int compare(Object o1, Object o2) { 10...
在Java编程语言中,处理中文和英文混合的排序问题是一个常见的需求,特别是在处理用户输入、数据库数据或文件名等场景。这个"关于中文英文混合排序javaDemo"的示例主要展示了如何实现这样的功能。让我们深入探讨一下...
"Java集合某个字段按照中文拼音排序" Java集合某个字段按照中文拼音排序是Java开发中经常遇到的问题。对Java集合中的某个字段按照中文拼音排序可以使用多种方法,本文将介绍两种常见的方法。 方法一:使用...
在计算机科学领域,汉字和数字混合排序是一项挑战性任务,特别是在处理中文文本数据时。由于汉字与数字在数据结构和编码上的本质差异,混合排序需要特定的算法和技术来实现。以下将详细介绍汉字和数字混合排序的相关...
以下是如何使用`pinyin4j`进行中文排序的详细步骤: 1. **添加依赖**:首先,你需要在项目中引入`pinyin4j`库。如果你的项目是Maven项目,可以在`pom.xml`文件中添加如下依赖: ```xml <groupId>...
在Java和SQL中,汉字排序是一项常见的需求,尤其是在处理中文数据时。在SQL Server中,汉字排序涉及到排序规则,这是决定字符串如何存储、比较和排序的关键因素。排序规则定义了字符的位模式,并且规定了在比较字符...
在SQLiteDatabase,特别是SQLite3中,处理中文排序问题是一个常见的挑战。SQLite3是一个轻量级、自包含的数据库引擎,广泛应用于嵌入式系统和移动应用。然而,它默认的排序规则可能不适用于中文字符,因为中文字符的...
在Java编程环境中,我们也可以模拟实现这种排序规则。Java提供了丰富的类库和方法来处理文件操作,包括对文件的排序。以下是关于如何在Java中实现Windows文件排序规则的详细解释: 1. **文件对象的创建**: 在Java...
本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法。分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[]...
这段代码演示了如何使用 `RuleBasedCollator` 来实现中文排序。通过创建一个 `RuleBasedCollator` 的实例并设置为中文环境,可以实现按照中文拼音排序的功能。 以上三个知识点总结了关于 Java 排序的一些基本应用,...
本主题将深入探讨如何使用SortedSet接口来实现Java对象的中文排序,并通过源码分析理解其工作原理。 首先,SortedSet是Java集合框架中的一个接口,它继承自Set接口并添加了排序的特性。SortedSet的主要实现类有...
- 排序:在展示汉字列表时,可以按照首字母进行排序。 7. **注意事项**: - 处理多音字:有些汉字有多个读音,需要根据上下文判断正确的拼音。 - 非汉字字符:处理文本时,可能遇到标点符号、数字和其他非汉字...
在Java编程中,有时我们需要对包含汉字的数据进行排序,特别是在处理中文名称或文本时。本文主要探讨如何在Java中实现汉字按照拼音进行排序,并提供相关的示例代码。 首先,Java的标准库提供了`java.text.Collator`...