时间:2021-05-20
遇到了一个对包含中文的字符串进行排序的问题。要求按unicode编码对字符串进行排序。
测试字符串数组如下:
String[] arr = { "1-测试", "1-编辑", "1-营销", "1结束", "2-测试", "1-qt" };按unicode排序的期望结果应该是这样的:
1-编辑, 1-测试, 1-营销, 1-qt, 1结束, 2-测试
先按java.lang.String类提供的默认比较方案进行实现,大致如下:
import java.util.Arrays;import java.util.Comparator;public class MyJob { public static void main(String[] args) { String[] arr = { "1-测试", "1-编辑", "1-营销", "1结束", "2-测试", "1-qt" }; Comparator<String> c = String::compareTo; Arrays.sort(arr, c); System.out.println(Arrays.toString(arr)); }}结果如下:
[1-qt, 1-测试, 1-编辑, 1-营销, 1结束, 2-测试]
可以看到中文字符不能按照拼音进行排序。这时最直接的思路就是将中文字符转为拼音后再进行排序。但是要注意下,在这里面有个字符串不包含中文字符,这就容易导致顺序混乱。
如下面这几个字符串按拼音进行排序顺序如下:
1-编辑,1-测试,1-qt,1-营销
可以看到字符串“1-qt”的位置出错了。 但是按拼音来说它的位置又是对的。这不能不说是一个让人有些头疼的地方。
不过不用担心,java提供了java.text.Collator类来支持规范化的字符串比较。
使用Collator来改造之前的代码:
import java.text.Collator;import java.util.Arrays;import java.util.Comparator;import java.util.Locale;public class MyJob { public static void main(String[] args) { String[] arr = { "1-测试", "1-编辑", "1-营销", "1结束", "2-测试", "1-qt" }; Comparator<String> c = (o1, o2) -> Collator.getInstance(Locale.CHINESE).compare(o1, o2); Arrays.sort(arr, c); System.out.println(Arrays.toString(arr)); }}改造后的程序执行排序的结果如下:
[1-qt, 1-编辑, 1-测试, 1结束, 1-营销, 2-测试]
结果看着好像还OK。但是停停、注意下、字符串“1结束”的位置好像比较奇妙,理想情况下它应该在“1-营销”的后面。
这里出问题的原因我没有弄清楚。猜测着应该是java在Chinese语法中将中划线处理为空字符了。不过最根本的问题还是java对Unicode Collation Algorithm(UCA,Unicode整理算法)的支持并不好。
此时可以考虑使用IBM ICU提供的Collator来替换jdk默认的Collator。代码如下:
import com.ibm.icu.text.Collator;import java.util.Arrays;import java.util.Comparator;import java.util.Locale;public class MyJob { public static void main(String[] args) { String[] arr = { "1-测试", "1-编辑", "1-营销", "1结束", "2-测试", "1-qt" }; Comparator<String> c = (o1, o2) -> Collator.getInstance(Locale.CHINESE).compare(o1, o2); Arrays.sort(arr, c); System.out.println(Arrays.toString(arr)); }}相关的依赖为:
<dependency> <groupId>com.ibm.icu</groupId> <artifactId>icu4j-localespi</artifactId> <version>60.2</version> </dependency>执行结果为:
[1-编辑, 1-测试, 1-营销, 1-qt, 1结束, 2-测试]
可以看到是和预期一致的。
总结
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了Java实现中文字符串与unicode互转的具体代码,供大家参考,具体内容如下原理利用了java实现js的escape以及unescape函
本文实例讲述了php自定义函数实现统计中文字符串长度的方法。分享给大家供大家参考,具体如下:中文字符计算为2个字符英文字符计算为1个代码/***可以统计中文字符
1、字符串前加u例:u"我是含有中文字符组成的字符串。"作用:后面字符串以Unicode格式进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次
复制代码代码如下:#############################为了避免截断中文字符##文件要求是unicode编码##txt文件另存为对话框下面有
其原理就是把中文字符转换为十六进制并按某种规则进行字符串组合,实现字符的编码与解编码,保证URL数据传递过程中字符的完整性和兼容性,主要讨论中文字符的编码情况。