一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 中文字符按Unicode排序的實現方法

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

2021-06-09 13:47robin Java教程

這篇文章主要介紹了Java 中文字符按Unicode排序的實現方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 啪啪无尽3d动漫漫画免费网站 | 黑人开嫩苞 | 精品欧美一区二区在线观看欧美熟 | 91看片淫黄大片.在线天堂 | 日韩中文字幕一区 | 欧美搞逼视频 | 忘忧草在线社区WWW日本直播 | 天天摸天天操天天爽 | 欧美一区二区三区久久久 | 亚欧成人一区二区 | 五月激情丁香婷婷综合第九 | 成年人免费在线看的惊悚动作片 | 国产色网址 | 成熟女人50岁一级毛片不卡 | 91成人啪国产啪永久地址 | ipx-177绝对领域在线观看 | 二次元美女脱裤子让男人桶爽 | 日本免费在线观看视频 | 黑人巨大初黑人解禁作品 | 四虎精品成人a在线观看 | 美女啪啪国产 | 亚洲欧美国产另类视频 | 大伊香蕉精品二区视频在线 | 亚洲老头老太hd | 精品国产免费一区二区三区 | 女教师雪白老汉 | 幸福草电视剧演员表介绍 | 日韩欧美国内 | 成人看片免费无限观看视频 | 翁公与小莹在客厅激情 | 忘忧草秋观看未满十八 | 四虎伊人| 欧美高清在线精品一区 | 国产欧美国产精品第一区 | 日本一区二区三区久久精品 | 男人日女人的逼视频 | 日韩每日更新 | 香蕉草莓视频 | 国产亚洲欧美在线中文bt天堂网 | 我的漂亮朋友在线观看全集免费 | 国产精品久久久久毛片 |