不需要网站备案的广告联盟,阜阳市建设工程质量检测站网站,wordpress 插件 教程视频教程,网站备案迁移在Java中一涉及中文处理就会冒出很多问题来#xff0c;其中排序也是一个让人头疼的课题#xff0c;我们来看下面的代码#xff1a;上面的代码定义一个数组#xff0c;然后进行升序排序#xff0c;我们期望的结果是按照拼音升序排列#xff0c;即为李四、王五、张三#… 在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个建议》作者秦小波声明本文只供学习使用未涉及任何商业利益如有侵权立删。支持作者赞赏就不用啦生活都不易右下角的“在看/赞”点一下如果感觉文章不错记得分享到朋友圈让更多人知道