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

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

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

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

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

输出结果如下:

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

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

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

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

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

作者:秦小波

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

支持作者

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

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

  1. java 英文字符串排序_英文字符串排序算法

    编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...

  2. java 桶排序_[图解] 桶排序

    桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...

  3. java 字符串匹配_多模字符串匹配算法原理及Java实现代码

    多模字符串匹配算法在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的.该算法广泛应用于 ...

  4. Java指令屏障_指令重排序和内存屏障

    sap hana计算技术项目实战指南内存 61元 (需用券) 去购买 > 一.指令重排序 指令重排序分为三种,分别为编译器优化重排序.指令级并行重排序.内存系统重排序.如图所示,后面两种为处理器 ...

  5. arraylist java 排序_「arraylist排序」java ArrayList的两种排序方法 - seo实验室

    arraylist排序 1.ArrayList使用排序的初衷 我们知道ArrayList的好处是可以不用限定容器的大小,他会根据元素的增加自己扩大.但是存储进去的数据类型都会变成object,虽然每个 ...

  6. java判断日文_判断字符串是否含有日文

    日文字符的Unicode编码范围是: U+3040–U+309F: Hiragana U+30A0–U+30FF: Katakana U+4E00–U+9FBF: Kanji 所以我们只需要对每一个字 ...

  7. java 鸡尾酒排序_算法渣-排序-冒泡

    没有一身好内功,招式再多都是空;算法绝对是防身必备,面试时更是不可或缺:跟着算法渣一起从零学算法 定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 这个算法的名字由来 ...

  8. 希尔排序python 简书_数据结构_排序_直接插入+希尔排序

    数据结构_排序_直接插入排序+希尔排序 其实主要是为了讲述希尔排序,不过插入排序是希尔排序的基础,因此先来讲直接插入排序. 一.直接插入排序 1.原理 下标 0 1 2 3 4 5 6 7 8 -- ...

  9. mysql连接字符串 端口_数据库连接字符串 端口号

    如何获取SQL server数据库的连接字符串 步骤:1.新建一个txt文本文档,然后把后缀名改为udl2.打开 新建文本文档. udl ,并选择相应的数据库进行连接,之后点击 "测试连接& ...

最新文章

  1. Fragment中调用getActivity为null的问题
  2. python自定义类如何定义向量的模_gensim的word2vec如何得出词向量(python)
  3. 初级和高级产品运营的分水岭指标:大局观和节奏感
  4. 句子迷,语录,俞凌雄 2
  5. python 初步学习
  6. SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化
  7. group by with cube
  8. FreeRTOS之源码 及 移植详解
  9. 详细解读二叉树基本操作
  10. stata进行空间自相关检验
  11. kafka安装包下载慢,国内镜像下载地址
  12. 第一个nanomsg的程序
  13. 已解决SyntaxError:positional argument follows keyword argument
  14. wpf 语音通话_WPF+WCF一步一步打造音频聊天室(四):视频会话
  15. 电压力锅中的计算机控制系统,电压力锅的(电脑板)工作原理
  16. 智能人物画像综合分析系统——Day21
  17. 计算标准累积正态分布_正态分布在用户等级划分的应用
  18. 清理垃圾文件属于计算机安全维护吗,垃圾文件清理,垃圾文件清理器
  19. 神秘美女接机刘谦 网友见证奇迹时刻:女子像舒淇
  20. 【python牛客刷题】——深度学习第一弹

热门文章

  1. js高级 — ES6
  2. tornada-数据库
  3. go语言值得学习的开源项目推荐
  4. 一 手游开发工具cocos2d-x editor初识
  5. 大道至简(第六章)读后感
  6. Tomcat8.0.21登录时忘记用户名和密码
  7. .Net 2.0里有一个有用的新功能:迭代器
  8. 一文带你吃透Vue生命周期(结合案例通俗易懂)
  9. Spring 钩子之BeanFactoryPostProcessor和BeanPostProcessor
  10. 学习File API用于前端读取文件