服务器之家

服务器之家 > 正文

Java 中文字符按Unicode排序的实现方法

时间:2021-06-09 13:47     来源/作者:robin

遇到了一个对包含中文的字符串进行排序的问题。要求按unicode编码对字符串进行排序。

测试字符串数组如下:

?
1
2
3
4
5
6
7
8
string[] arr = {
    "1-测试",
    "1-编辑",
    "1-营销",
    "1结束",
    "2-测试",
    "1-qt"
};

按unicode排序的期望结果应该是这样的:

1-编辑, 1-测试, 1-营销, 1-qt, 1结束, 2-测试

先按java.lang.string类提供的默认比较方案进行实现,大致如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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来改造之前的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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。代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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));
  }
}

相关的依赖为:

?
1
2
3
4
5
<dependency>
   <groupid>com.ibm.icu</groupid>
   <artifactid>icu4j-localespi</artifactid>
   <version>60.2</version>
 </dependency>

执行结果为:

[1-编辑, 1-测试, 1-营销, 1-qt, 1结束, 2-测试]

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

总结

原文链接:http://www.zhyea.com/2018/10/30/java-string-in-chinese-sort-with-unicode.html

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部