最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年10月31日 09:20:48   作者:robin  
這篇文章主要介紹了Java 中文字符按Unicode排序的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

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

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

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

1-編輯, 1-測(cè)試, 1-營(yíng)銷, 1-qt, 1結(jié)束, 2-測(cè)試

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

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

結(jié)果如下:

[1-qt, 1-測(cè)試, 1-編輯, 1-營(yíng)銷, 1結(jié)束, 2-測(cè)試]

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

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

1-編輯,1-測(cè)試,1-qt,1-營(yíng)銷

可以看到字符串“1-qt”的位置出錯(cuò)了。 但是按拼音來(lái)說(shuō)它的位置又是對(duì)的。這不能不說(shuō)是一個(gè)讓人有些頭疼的地方。

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

使用Collator來(lái)改造之前的代碼:

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-測(cè)試",
        "1-編輯",
        "1-營(yíng)銷",
        "1結(jié)束",
        "2-測(cè)試",
        "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-測(cè)試, 1結(jié)束, 1-營(yíng)銷, 2-測(cè)試]

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

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

此時(shí)可以考慮使用IBM ICU提供的Collator來(lái)替換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-測(cè)試",
        "1-編輯",
        "1-營(yíng)銷",
        "1結(jié)束",
        "2-測(cè)試",
        "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-測(cè)試, 1-營(yíng)銷, 1-qt, 1結(jié)束, 2-測(cè)試]

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

總結(jié)

相關(guān)文章

  • 一篇文章教你使用SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)

    一篇文章教你使用SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)

    這篇文章主要給大家介紹了關(guān)于如何利用一篇文章教你使用SpringBoot實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 關(guān)于MyBatis各種SQL操作詳解

    關(guān)于MyBatis各種SQL操作詳解

    這篇文章主要介紹了關(guān)于MyBatis各種SQL操作詳解,MyBatis 是一款優(yōu)秀的半自動(dòng)的ORM持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射,需要的朋友可以參考下
    2023-05-05
  • SpringMvc @Valid如何拋出攔截異常

    SpringMvc @Valid如何拋出攔截異常

    這篇文章主要介紹了SpringMvc @Valid如何拋出攔截異常,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring與Shiro整合及加載權(quán)限表達(dá)式問(wèn)題

    Spring與Shiro整合及加載權(quán)限表達(dá)式問(wèn)題

    這篇文章主要介紹了Spring與Shiro整合及加載權(quán)限表達(dá)式問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java本地緩存工具之LoadingCache的使用詳解

    Java本地緩存工具之LoadingCache的使用詳解

    緩存,在我們?nèi)粘i_(kāi)發(fā)中是必不可少的一種解決性能問(wèn)題的方法。簡(jiǎn)單的說(shuō),cache?就是為了提升系統(tǒng)性能而開(kāi)辟的一塊內(nèi)存空間。本文將為大家介紹一個(gè)Java本地緩存的工具——LoadingCache,感興趣的可以了解一下
    2021-12-12
  • 分隔List集合,按指定大小,將集合分成多個(gè)的方法

    分隔List集合,按指定大小,將集合分成多個(gè)的方法

    下面小編就為大家?guī)?lái)一篇分隔List集合,按指定大小,將集合分成多個(gè)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題

    IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題

    這篇文章主要介紹了IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 兩種Spring服務(wù)關(guān)閉時(shí)對(duì)象銷毀的實(shí)現(xiàn)方法

    兩種Spring服務(wù)關(guān)閉時(shí)對(duì)象銷毀的實(shí)現(xiàn)方法

    spring提供了兩種方式用于實(shí)現(xiàn)對(duì)象銷毀時(shí)去執(zhí)行的操作,本文主要為大家詳細(xì)介紹了這兩種方式的具體實(shí)現(xiàn),文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助
    2023-04-04
  • java的java.security.egd源碼解讀

    java的java.security.egd源碼解讀

    這篇文章主要為大家介紹了java的java.security.egd源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機(jī)制

    深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機(jī)制

    本文將深入探討SpringMVC的參數(shù)綁定方式,包括基本類型、對(duì)象、集合等類型的綁定方式,以及如何處理參數(shù)校驗(yàn)和異常。同時(shí),本文還將介紹SpringMVC的數(shù)據(jù)響應(yīng)機(jī)制,包括如何返回JSON、XML等格式的數(shù)據(jù),以及如何處理文件上傳和下載。
    2023-06-06

最新評(píng)論

长葛市| 蛟河市| 高密市| 华坪县| 五原县| 临潭县| 龙里县| 武穴市| 来宾市| 石首市| 绿春县| 海丰县| 昌宁县| 巩留县| 大埔区| 新巴尔虎右旗| 通道| 蒙山县| 铜陵市| 增城市| 陵川县| 罗定市| 思南县| 晋江市| 新营市| 讷河市| 耒阳市| 繁昌县| 正镶白旗| 广饶县| 吐鲁番市| 闽侯县| 呼图壁县| 海伦市| 深州市| 双鸭山市| 阜平县| 安丘市| 康马县| 彩票| 板桥市|