国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Java 中文字符按Unicode排序的實現(xiàn)方法

2024-07-14 08:42:43
字體:
供稿:網(wǎng)友

遇到了一個對包含中文的字符串進(jìn)行排序的問題。要求按unicode編碼對字符串進(jìn)行排序。

測試字符串?dāng)?shù)組如下:

    String[] arr = {        "1-測試",        "1-編輯",        "1-營銷",        "1結(jié)束",        "2-測試",        "1-qt"    };

按unicode排序的期望結(jié)果應(yīng)該是這樣的:

1-編輯, 1-測試, 1-營銷, 1-qt, 1結(jié)束, 2-測試

先按java.lang.String類提供的默認(rèn)比較方案進(jìn)行實現(xiàn),大致如下:

import java.util.Arrays;import java.util.Comparator;public class MyJob {  public static void main(String[] args) {    String[] arr = {        "1-測試",        "1-編輯",        "1-營銷",        "1結(jié)束",        "2-測試",        "1-qt"    };    Comparator<String> c = String::compareTo;    Arrays.sort(arr, c);    System.out.println(Arrays.toString(arr));  }}

結(jié)果如下:

[1-qt, 1-測試, 1-編輯, 1-營銷, 1結(jié)束, 2-測試]

可以看到中文字符不能按照拼音進(jìn)行排序。這時最直接的思路就是將中文字符轉(zhuǎn)為拼音后再進(jìn)行排序。但是要注意下,在這里面有個字符串不包含中文字符,這就容易導(dǎo)致順序混亂。

如下面這幾個字符串按拼音進(jìn)行排序順序如下:

1-編輯,1-測試,1-qt,1-營銷

可以看到字符串“1-qt”的位置出錯了。 但是按拼音來說它的位置又是對的。這不能不說是一個讓人有些頭疼的地方。

不過不用擔(dān)心,java提供了java.text.Collator類來支持規(guī)范化的字符串比較。

使用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結(jié)束",        "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));  }}

改造后的程序執(zhí)行排序的結(jié)果如下:

[1-qt, 1-編輯, 1-測試, 1結(jié)束, 1-營銷, 2-測試]

結(jié)果看著好像還OK。但是停停、注意下、字符串“1結(jié)束”的位置好像比較奇妙,理想情況下它應(yīng)該在“1-營銷”的后面。

這里出問題的原因我沒有弄清楚。猜測著應(yīng)該是java在Chinese語法中將中劃線處理為空字符了。不過最根本的問題還是java對Unicode Collation Algorithm(UCA,Unicode整理算法)的支持并不好。

此時可以考慮使用IBM ICU提供的Collator來替換jdk默認(rèn)的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結(jié)束",        "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));  }}

相關(guān)的依賴為:

   <dependency>      <groupId>com.ibm.icu</groupId>      <artifactId>icu4j-localespi</artifactId>      <version>60.2</version>    </dependency>

執(zhí)行結(jié)果為:

[1-編輯, 1-測試, 1-營銷, 1-qt, 1結(jié)束, 2-測試]

可以看到是和預(yù)期一致的。

總結(jié)


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 伊宁县| 武功县| 西乌| 喀喇沁旗| 独山县| 张掖市| 乌拉特中旗| 剑阁县| 青阳县| 深水埗区| 贡山| 金乡县| 淮安市| 贡觉县| 盖州市| 乐昌市| 镇雄县| 都安| 印江| 鹤山市| 松原市| 广德县| 永仁县| 务川| 广安市| 阿尔山市| 高平市| 辛集市| 革吉县| 孙吴县| 新源县| 江阴市| 大足县| 高清| 河源市| 雅安市| 若羌县| 扎兰屯市| 江永县| 黄梅县| 宁乡县|