Java 中文字符按Unicode排序

栏目: Java · 发布时间: 5年前

内容简介:遇到了一个对包含中文的字符串进行排序的问题。要求按unicode编码对字符串进行排序。测试字符串数组如下:按unicode排序的期望结果应该是这样的:

遇到了一个对包含中文的字符串进行 排序 的问题。要求按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-测试]

可以看到是和预期一致的。

参考文档

##########


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序设计艺术(第3卷 英文版·第2版)

计算机程序设计艺术(第3卷 英文版·第2版)

Donald E.Knuth / 人民邮电出版社 / 2010-10 / 119.00元

《计算机程序设计艺术》系列被公认为计算机科学领域的权威之作,深入阐述了程序设计理论,对计算机领域的发展有着极为深远的影响。本书是该系列的第3卷,扩展了第1卷中信息结构的内容,主要讲排序和查找。书中对排序和查找算法进行了详细的介绍,并对各种算法的效率做了大量的分析。 本书适合从事计算机科学、计算数学等各方面工作的人员阅读,也适合高等院校相关专业的师生作为教学参考书,对于想深入理解计算机算法的读......一起来看看 《计算机程序设计艺术(第3卷 英文版·第2版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器