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

Java實(shí)現(xiàn)自定義中文排序的方法機(jī)注意事項(xiàng)

 更新時(shí)間:2024年10月24日 10:03:39   作者:碼農(nóng)研究僧  
在Java中,中文排序通常涉及到使用Collator類(lèi)來(lái)處理字符串的比較,確保根據(jù)漢字的拼音順序進(jìn)行排序,本文給大家介紹了Java實(shí)現(xiàn)自定義中文排序的方法機(jī)注意事項(xiàng),并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下

1. 基本知識(shí)

在Java中,中文排序通常涉及到使用Collator類(lèi)來(lái)處理字符串的比較,確保根據(jù)漢字的拼音順序進(jìn)行排序

以下是詳細(xì)分析和示例代碼:(上述鏈接文章已經(jīng)說(shuō)清楚了,但先講解一遍淺顯的知識(shí))

  • Collator類(lèi):用于比較字符串,特別適用于處理不同語(yǔ)言的排序
  • Locale:指定語(yǔ)言環(huán)境,影響排序規(guī)則
  • compare方法:用于比較兩個(gè)字符串,根據(jù)指定的語(yǔ)言環(huán)境返回排序結(jié)果

示例代碼如下:

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

public class ChineseSortingDemo {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)包含中文字符串的列表
        List<String> chineseNames = new ArrayList<>();
        chineseNames.add("張三");
        chineseNames.add("李四");
        chineseNames.add("王五");
        chineseNames.add("趙六");

        // 獲取中文排序的Collator實(shí)例
        Collator collator = Collator.getInstance(Locale.CHINESE);

        // 對(duì)列表進(jìn)行排序
        Collections.sort(chineseNames, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return collator.compare(o1, o2); // 使用Collator比較
            }
        });

        // 輸出排序后的結(jié)果
        System.out.println("排序后的中文名字:");
        for (String name : chineseNames) {
            System.out.println(name);
        }
    }
}

基本的邏輯如下:

  1. 導(dǎo)入所需類(lèi):導(dǎo)入Collator、ArrayList、Collections、Comparator和Locale
  2. 創(chuàng)建列表:使用ArrayList來(lái)存儲(chǔ)中文字符串
  3. 獲取Collator實(shí)例:使用Collator.getInstance(Locale.CHINESE)來(lái)獲取適用于中文的排序規(guī)則
  4. 排序操作:通過(guò)Collections.sort()和自定義比較器,使用collator.compare()進(jìn)行排序

2. 實(shí)戰(zhàn)

自定義中文排序通常涉及對(duì)字符串的特定部分進(jìn)行比較,以滿(mǎn)足業(yè)務(wù)需求

主要目標(biāo)是按照特定的中文數(shù)字(如“一”、“二”等)和名稱(chēng)排序,邏輯如下

  1. 提取數(shù)字部分:通過(guò)extractChineseNumber方法,從每個(gè)字符串中提取漢字?jǐn)?shù)字部分。如果字符串包含漢字?jǐn)?shù)字,則優(yōu)先根據(jù)這些數(shù)字排序
  2. 排序優(yōu)先級(jí):首先,包含“類(lèi)”的項(xiàng)優(yōu)先。其次,根據(jù)提取的漢字?jǐn)?shù)字進(jìn)行排序,使用自定義比較器來(lái)定義排序規(guī)則。
    最后,對(duì)于沒(méi)有數(shù)字的項(xiàng),按字典順序排序
  3. 使用流式處理:通過(guò)Java 8的流式API進(jìn)行排序,增強(qiáng)代碼的可讀性和簡(jiǎn)潔性

注意事項(xiàng)

  • 字符集:確保輸入的字符串都為標(biāo)準(zhǔn)漢字,避免因字符集不同導(dǎo)致的排序錯(cuò)誤
  • 性能:在處理大量數(shù)據(jù)時(shí),排序操作可能會(huì)影響性能,盡量?jī)?yōu)化提取邏輯
  • 多樣性:考慮到可能存在的多種中文數(shù)字(如“零”)和不同的業(yè)務(wù)需求,確保排序規(guī)則的靈活性
  • 邊界情況:處理字符串中可能沒(méi)有漢字?jǐn)?shù)字的情況,避免空指針異常
// 查詢(xún)所有數(shù)據(jù),不進(jìn)行分頁(yè)
List<Sort> allRecords = sortService.list(queryWrapper);

// 自定義中文數(shù)字排序規(guī)則
Comparator<String> chineseNumberComparator = (a, b) -> {
    String[] chineseNumbers = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
    List<String> chineseNumberList = Arrays.asList(chineseNumbers);

    // 獲取字符串的漢字?jǐn)?shù)字部分
    String aNumberPart = extractChineseNumber(a);
    String bNumberPart = extractChineseNumber(b);

    // 如果都包含漢字?jǐn)?shù)字部分,則按自定義順序排序
    if (chineseNumberList.contains(aNumberPart) && chineseNumberList.contains(bNumberPart)) {
        return Integer.compare(chineseNumberList.indexOf(aNumberPart), chineseNumberList.indexOf(bNumberPart));
    }
    // 如果只有一個(gè)包含漢字?jǐn)?shù)字,優(yōu)先含有數(shù)字的排序
    else if (chineseNumberList.contains(aNumberPart)) {
        return -1;
    } else if (chineseNumberList.contains(bNumberPart)) {
        return 1;
    }
    // 如果都不包含漢字?jǐn)?shù)字,則按字典序排序
    return a.compareTo(b);
};

// 對(duì)所有記錄進(jìn)行排序
List<Sort> sortedRecords = allRecords.stream()
    .sorted(Comparator.comparing((Sort record) -> {
            String sortNameRecord = record.getSortName();
            // 首先檢查是否包含“類(lèi)”,并提取類(lèi)的前綴
            boolean hasClass = sortNameRecord.contains("類(lèi)");
            // 確保包含“類(lèi)”的項(xiàng)優(yōu)先
            return hasClass ? 0 : 1; // 優(yōu)先級(jí)
        })
        .thenComparing(Comparator.comparing((Sort record) -> {
            String sortNameRecord = record.getSortName();
            // 如果包含“類(lèi)”,提取漢字?jǐn)?shù)字部分并按其索引排序
            if (sortNameRecord.contains("類(lèi)")) {
                return extractChineseNumber(sortNameRecord); // 提取漢字?jǐn)?shù)字部分
            }
            return ""; // 沒(méi)有類(lèi)的項(xiàng)返回空字符串以放置在最后
        }, chineseNumberComparator)) // 按漢字?jǐn)?shù)字排序
        .thenComparing(Comparator.comparing(Sort::getSortName)) // 按名稱(chēng)進(jìn)行自然排序
    )
    .collect(Collectors.toList());

/**
 * 提取字符串中的漢字?jǐn)?shù)字部分
 */
private String extractChineseNumber(String str) {
    String[] chineseNumbers = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
    for (String number : chineseNumbers) {
        if (str.contains(number)) {
            return number;
        }
    }
    return ""; // 如果沒(méi)有漢字?jǐn)?shù)字,返回空字符串
}

截圖如下:

最終效果如下:

測(cè)試的總體Demo如下:

import java.util.*;
import java.util.stream.Collectors;

public class CustomChineseSorting {
    public static void main(String[] args) {
        List<Sort> allRecords = sortService.list(queryWrapper);
        
        // 自定義中文數(shù)字排序規(guī)則
        Comparator<String> chineseNumberComparator = (a, b) -> {
            String[] chineseNumbers = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "零"};
            List<String> chineseNumberList = Arrays.asList(chineseNumbers);

            String aNumberPart = extractChineseNumber(a);
            String bNumberPart = extractChineseNumber(b);

            if (chineseNumberList.contains(aNumberPart) && chineseNumberList.contains(bNumberPart)) {
                return Integer.compare(chineseNumberList.indexOf(aNumberPart), chineseNumberList.indexOf(bNumberPart));
            } else if (chineseNumberList.contains(aNumberPart)) {
                return -1;
            } else if (chineseNumberList.contains(bNumberPart)) {
                return 1;
            }
            return a.compareTo(b);
        };

        // 對(duì)所有記錄進(jìn)行排序
        List<Sort> sortedRecords = allRecords.stream()
            .sorted(Comparator.comparing((Sort record) -> {
                    String sortNameRecord = record.getSortName();
                    return sortNameRecord.contains("類(lèi)") ? 0 : 1;
                })
                .thenComparing(Comparator.comparing((Sort record) -> {
                    String sortNameRecord = record.getSortName();
                    if (sortNameRecord.contains("類(lèi)")) {
                        return extractChineseNumber(sortNameRecord);
                    }
                    return ""; 
                }, chineseNumberComparator))
                .thenComparing(Comparator.comparing(Sort::getSortName))
            )
            .collect(Collectors.toList());

        // 輸出排序后的結(jié)果
        sortedRecords.forEach(record -> System.out.println(record.getSortName()));
    }

    // 提取字符串中的漢字?jǐn)?shù)字部分
    private static String extractChineseNumber(String str) {
        String[] chineseNumbers = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
        for (String number : chineseNumbers) {
            if (str.contains(number)) {
                return number;
            }
        }
        return ""; 
    }
}

主要的注意事項(xiàng)如下:

  • 處理多個(gè)漢字?jǐn)?shù)字
    若需要處理更大的數(shù)字(如“十一”、“十二”等),可進(jìn)一步擴(kuò)展extractChineseNumber方法,以支持更復(fù)雜的模式
  • 兼容性排序
    可以考慮為英文字符或其他語(yǔ)言字符設(shè)置不同的排序邏輯,以滿(mǎn)足多語(yǔ)言應(yīng)用的需求
  • 負(fù)數(shù)處理
    如果存在負(fù)數(shù)表示,可以在提取漢字?jǐn)?shù)字時(shí)加入相關(guān)邏輯

到此這篇關(guān)于Java實(shí)現(xiàn)自定義中文排序的方法機(jī)注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Java自定義中文排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot項(xiàng)目引入druid安裝部署使用教程

    Springboot項(xiàng)目引入druid安裝部署使用教程

    這篇文章主要介紹了Springboot項(xiàng)目引入druid安裝部署使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 使用EasyExcel實(shí)現(xiàn)百萬(wàn)級(jí)別數(shù)據(jù)導(dǎo)出的代碼示例

    使用EasyExcel實(shí)現(xiàn)百萬(wàn)級(jí)別數(shù)據(jù)導(dǎo)出的代碼示例

    近期需要開(kāi)發(fā)一個(gè)將百萬(wàn)數(shù)據(jù)量MySQL8的數(shù)據(jù)導(dǎo)出到excel的功能,所以本文講給大家介紹了基于EasyExcel實(shí)現(xiàn)百萬(wàn)級(jí)別數(shù)據(jù)導(dǎo)出,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • java LRU算法介紹與用法示例

    java LRU算法介紹與用法示例

    這篇文章主要介紹了java LRU算法,簡(jiǎn)單介紹了LRU算法的概念并結(jié)合實(shí)例形式分析了LRU算法的具體使用方法,需要的朋友可以參考下
    2017-09-09
  • Druid數(shù)據(jù)庫(kù)連接池監(jiān)控使用及說(shuō)明

    Druid數(shù)據(jù)庫(kù)連接池監(jiān)控使用及說(shuō)明

    Druid是Java數(shù)據(jù)庫(kù)連接池,具有監(jiān)控和擴(kuò)展功能,性能好,自帶監(jiān)控頁(yè)面,支持密碼加密、SQL執(zhí)行日志等,Druid已經(jīng)在阿里巴巴部署了超過(guò)600個(gè)應(yīng)用
    2025-12-12
  • 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)

    基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)

    下面小編就為大家?guī)?lái)一篇基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 基于SpringBoot?使用?Flink?收發(fā)Kafka消息的示例詳解

    基于SpringBoot?使用?Flink?收發(fā)Kafka消息的示例詳解

    這篇文章主要介紹了基于SpringBoot?使用?Flink?收發(fā)Kafka消息,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Java 十大排序算法之計(jì)數(shù)排序刨析

    Java 十大排序算法之計(jì)數(shù)排序刨析

    計(jì)數(shù)排序是一個(gè)非基于比較的排序算法,該算法于1954年由 Harold H. Seward 提出。它的優(yōu)勢(shì)在于在對(duì)一定范圍內(nèi)的整數(shù)排序時(shí),它的復(fù)雜度為Ο(n+k)(其中k是整數(shù)的范圍),快于任何比較排序算法
    2021-11-11
  • MySQL查詢(xún)字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    MySQL查詢(xún)字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    本文主要介紹了MySQL查詢(xún)字段實(shí)現(xiàn)字符串分割split功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景)

    Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景)

    這篇文章主要介紹了Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Spring Security登陸流程講解

    Spring Security登陸流程講解

    本文主要介紹了Spring Security登陸流程講解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

长乐市| 兖州市| 商城县| 丹凤县| 广汉市| 吴忠市| 盐山县| 南漳县| 信宜市| 浑源县| 廊坊市| 澜沧| 太和县| 神农架林区| 汽车| 宁陵县| 射洪县| 武冈市| 苏州市| 南召县| 保靖县| 砚山县| 毕节市| 武汉市| 吉林省| 闽清县| 丰台区| 方山县| 涟源市| 丰县| 西乡县| 札达县| 沾益县| 修水县| 东宁县| 游戏| 乐都县| 泾阳县| 寿宁县| 澄城县| 东乌珠穆沁旗|