java字符串排序_对字符串排序持一种宽容的心态

98d33d993d2eeb191291ffd329ada2a3.gif

78612fa16a44690aa5c2d8baab6da4af.gif

9974cbea87a848fda5105cd5bb977b5d.png

在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码:

bf0aabc21cda775cb6494fc51481e3e6.png

上面的代码定义一个数组,然后进行升序排序,我们期望的结果是按照拼音升序排列,即为李四、王五、张三,但是结果却不是这样的:

a813611998b57fe1efa8c9603417f2df.png

这是按照什么排序的呀,非常混乱!我们知道Arrays工具类的默认排序是通过数组元素的compareTo方法来进行比较的,那我们来看String类的compareTo的主要实现:

49b9e742bad793d4d60a3fced74e899a.png

上面的代码先取得字符串的字符数组,然后一个一个地比较大小,注意这里是字符比较(减号操作符),也就是UNICODE码值的比较,查一下UNICODE代码表,“张”的码值是5F20,而“李”是674E,这样一看,“张”排在“李”的前面也就很正确了—但这明显与我们的意图冲突了。这一点在JDK文档中也有说明:对于非英文的String排序可能会出现不准确的情况。那该如何解决这个问题呢?Java推荐使用

Collator类进行排序,那好,我们把代码修改一下:

5249bc4f42560e73812147139b4f45a1.png

输出结果如下:

1c33b009601d43f75644aa9b3c7c3531.png

这确实是我们期望的结果,应该举杯庆贺了吧!但是且慢,中国的汉字博大精深,Java是否都能精确的排序呢?最主要的一点是汉字中有象形文字,音形分离,是不是每个汉字都能按照拼音的顺序排列好呢?我们写一个复杂的汉字来看看:

1750eb729bdf12cbf7d436126053fdad.png

三个牛“犇”读bēn,三个金“鑫”读xīn,这两个字经常出现在饭店和商店的名称上,我们来看排序的输出结果:

9adcd51348a526f454ed5b585e0153d0.png

输出结果又乱了!不要责怪Java,它已经尽量为我们考虑了,只是因为我们的汉字文化太博大精深了,要做好这个排序确实有点难为它。更深层次的原因是Java使用的是UNICODE编码,而中文UNICODE字符集是来源于GB18030的,GB18030又是从GB2312发展起来,GB2312是一个包含了7000多个字符的字符集,它是按照拼音排序,并且是连续的,之后的GBK、GB18030都是在其基础上扩充出来的,所以要让它们完整排序也就难上加难了。

如果是排序对象是经常使用的汉字,使用Collator类排序完全可以满足我们的要求,毕竟GB2312已经包含了大部分的汉字,如果需要严格排序,则要使用一些开源项目来自己实现了,比如pinyin4j可以把汉字转换为拼音,然后我们自己来实现排序算法,不过此时你也会发现要考虑诸如算法、同音字、多音字等众多问题。

本文参考自:《编写高质量代码:改善java程序的151个建议》

作者:秦小波

声明:本文只供学习使用,未涉及任何商业利益,如有侵权,立删。

支持作者

赞赏就不用啦,生活都不易,右下角的“在看/赞”点一下,如果感觉文章不错,记得分享到朋友圈让更多人知道!

f704391d281c2924297d8c588e1e5841.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rails开发随手记-0

helper默认是只在view中可用的,如果在controller中也要使用,要在ApplicationController中 include 如果model中如果有叫做type的列的话,会触发rails的Single Table Inheritance ,放弃它吧,不好用,还是安心使…

nagios 监控配置介绍(二)

#配置服务端监控客户端[rootnagios etc]# cd objects/[rootnagios objects]# vi hosts.cfg# Define a host for the local machinedefine host{use linux-serverhost_name 1.3-sambaalias 1.3-sambaaddress …

spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看

SPOJ.com - Problem SUBLEX 这么裸的一个SAM,放在了死破OJ上面就是个坑。 注意用SAM做的时候输出要用一个数组存下来,然后再puts,不然一个一个字符输出会更慢。 还有一个就是不要多数据输入,估计最后多了几个没用的数字&#xff0…

mt4双线macd_3年内从亏损90多万到获利近760万,我只坚持我的:60分钟MACD双回拉战法!附选股公式...

MACD指标被普遍认为是最经典实用的技术指标之一。其实并不是因为MACD有多么精妙的算法,而是MACD遵循了最基本的“均线指导原则”,形象的将经典双均线系统换了一种更加直观的表达方式。在MT4中,默认应用的是单线MACD指标,而在证券市…

计算机专业书籍速读方法,格式你玩的转?速读5分钟就懂

小编又接到了新问题,有小伙伴说自己64GB的U盘在电脑里格式化只能选ExFAT或者NTFS,不能选择FAT32,求小编解答,小编正好借着这个机会,说说现在电脑格式问题。如果你懒得读,↓↓↓最后一段有答案,如…

java项目打jar包

http://www.cnblogs.com/tianguook/archive/2012/03/14/2396335.html java项目打jar包分为2种情况: 一、java项目没有导入第三方jar包 这时候打包就比较简单: 1. 首先在Eclipse中打开项目, 右键点击项目,选择“Export”&#xff1…

第一天 :学习node.js

第一天 :学习node.js ① node.js环境配置 我学过的语言最简单的一门 直接百度就可以配置 ② 每个入门 的程序都是从helloworld开始 代码如下 : var httprequire(http); http.createServer(function(req,res){ res.writeHead(200,{content-type:text/htm…

c语言从入门到精通第四版电子书_C语言从入门到精通(吐血分享)4.pdf

C语言从入门到精通(吐血分享)4成功!结构体、链表、文件数组、字符串函数、指针三种结构化程序设计三种数据类型、六大表达式一、简单的程序#include 数学函数 命令行main() /*主函数*/{ /*左花括号,函数体的开始 */int a,b,c; /*定义语句*/a 3; /*执行语…

从硬盘上把数据传回到计算机称为什么,计算机基础知识 第一章 习题三

计算机基础知识第一章习题三一、填空题1. 高级语言不能直接被计算机识别并执行,必须翻译成机器语言,翻译的方式有两种:一种是编译方式,另一种是方式。2. 计算机中存储数据的最小单位是;存储容量的基本单位是。3. CAI的…

Mentor PADS 9.5下载安装及破解指南

Pads,是一款用于设计、模拟电子线路及设计电路板的电脑软件,原由Innoveda公司开发,其后改名为PowerPCB,在2002年4月Innoveda被Mentor Graphics收购,近年再次改用原名Pads。目前该软件是国内从事电路设计的工程师和技术…

Thymeleaf 学习笔记 (4)~~~~

2019独角兽企业重金招聘Python工程师标准>>> 模板布局 模板布局主要用到的标记有这么几个: th:fragment ,用来定义片段的,用法:th:fragment"fragmentName",起一个名字方便被其他地方引用&#xf…

凭证 金蝶_金蝶软件账务处理流程之——凭证录入

金蝶是我们财务人非常熟悉的财务软件,但是我们很多财务人只在应用软件的时候还是会出现很多的问题,为了帮助大家更好地应用这个软件,小编今天就来和大家讲讲关于金蝶软件凭证查询环节的一些基本处理流程。点击主界面“凭证查询”→弹出凭证过…

计算机网申兴趣爱好怎么写,银行网申个人特长和兴趣爱好怎么写

银行网申个人特长和兴趣爱好怎么写银行网申中个人简历及兴趣爱好怎么写?下面jyj135小编为大家整理了银行网申中个人特长和兴趣爱好的写作技巧,希望能为大家提供帮助!银行网申特长及兴趣爱好怎么写?特长Strong Point(1)写强项。弱项一定不要写,面试人员…

单例模式讨论篇:单例模式与垃圾回收

出处:http://blog.csdn.net/zhengzhb/article/details/7331354 Jvm的垃圾回收机制到底会不会回收掉长时间不用的单例模式对象,这的确是一个比较有争议性的问题。将这一部分内容单独成篇的目的也是为了与广大博友广泛的讨论一下这个问题。为了能让更多的人…

inline关键字

本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Dec…

springmvc 组合注解

组合注解的意思就是一个注解中包含多个注解。在springmvc 的RestController中,你就可发现. Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Controller ResponseBody public interface RestController {/*** The value may indicate a su…

人才管理是什么意思_上海托管仓库外包仓库管理什么意思

上海托管仓库外包仓库管理什么意思上海仓库托管外包。好的上海仓库托管是预估好自己的货物总计有多少个方。车子的体积有多少,然后估算出总计需要多少车需要多少钱,需要怎么装车、卸货码放方式是什么样的,算出总的费用然后包干给搬家公司。这…

window server 安装与卸载

安装window server 程序:C:\Windows\Microsoft.NET\Framework\v2.0.50727\installutil DataUpdateService.exe net start LuceneServer 卸载window server 程序:net stop LuceneServer C:\Windows\Microsoft.NET\Framework\v2.0.50727\installutil /U DataUpdateService.exe …

Makefile学习(二)[第二版]

复杂实例#示例1:在上一个示例的基础上再增加一个可执行文件03test[修改之处已标红].PHONY: clean all CC gcc CFLAGS -Wall -gBIN 01test 02test 03testSOURCES $(BIN:.c)OBJECTS $(BIN:.o)all: $(BIN)01test: 01test.o02test: 02test.o03test: 03test.o.c.o:$(CC) $(CFLA…

计算机网络asp视频教程,轻轻松松学编程!ASP互动视频教程

从2006年5月18日开始,PConline将与FIF联合推出国内网上第一部互动视频教程:《ASP互动视频教程》。它预示着一个全新的自助学习时代的到来。尽管相较于传统的图文教程,以前的多媒体视频课件优点非常明显,但它仍然存在交互性差的缺点…