麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

Java 中文字符按Unicode排序的實現方法

2024-07-14 08:42:43
字體:
來源:轉載
供稿:網友

遇到了一個對包含中文的字符串進行排序的問題。要求按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-測試]

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

總結


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久蜜桃精品一区二区三区综合网 | 精品视频 久久久 | 成年人在线视频免费 | 国产亚洲欧美一区久久久在 | 国产一级免费片 | 狠狠操精品视频 | 欧美不卡视频在线观看 | 精品亚洲福利一区二区 | 久草手机视频在线观看 | 精品在线一区二区三区 | 石原莉奈日韩一区二区三区 | 视频一区 日韩 | 成人福利在线 | 午夜精品福利影院 | 天天撸日日夜夜 | 黄色网址免费进入 | 噜噜社 | 日本a大片 | av在线网站观看 | 一级毛片真人免费播放视频 | 7777奇米成人四色影视 | 国产日韩线路一线路二 | 88xx成人永久免费观看 | 国产日韩中文字幕 | 欧美亚洲另类在线 | 人人舔人人舔 | 午夜视频在线观看免费视频 | 免费a级毛片永久免费 | 亚洲一级片在线观看 | 欧洲精品视频在线观看 | 国产在线观看免费视频软件 | av电影免费在线看 | 久久99精品国产99久久6男男 | 久草视频福利在线观看 | 欧美亚洲黄色 | 精品一区二区三区免费看 | 九九热在线视频观看这里只有精品 | 欧美视频一二三区 | 特片网久久| 欧美成人二区 | 精品国产一区二区三区成人影院 |