首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 中文排序完全指南:Collator 實現漢字拼音/筆畫/部首多維度排序

     編輯:Java 綜合教學

核心類:java.text.Collator

Collator 是**區域敏感字串比較器**,支援按語言規則排序。對中文,`Locale.CHINA`(大陸簡體)、`Locale.TAIWAN`(繁體)、`Locale.CHINESE`(通用)對應不同排序規則。

基礎用法:拼音排序(預設)

List books = Arrays.asList("英語", "日語", "德語", "法語", "俄語");
Collator collator = Collator.getInstance(Locale.CHINA);
books.sort(collator::compare);
// 結果:德語、俄語、法語、英語、日語(按拼音首字母 d, e, f, y, r)

進階:自定義比較器排序對象集合

public class Book {
    private String id, name, publisher;
    // 構造器、getter、toString
}

public class ChineseBookComparator implements Comparator {
    private final Collator collator = Collator.getInstance(Locale.CHINA);

    @Override
    public int compare(Book b1, Book b2) {
        return collator.compare(b1.getName(), b2.getName());
    }
}

// 使用
List list = new ArrayList<>();
list.add(new Book("1", "英語", "外語出版社"));
list.add(new Book("2", "日語", "東方出版社"));
list.add(new Book("3", "德語", "外語出版社"));
Collections.sort(list, new ChineseBookComparator());
// 或 list.sort(new ChineseBookComparator());

多維度排序策略:Collator 強度設置

強度級別常量比較行為中文效果
PRIMARYCollator.PRIMARY僅比較基礎字母/拼音忽略聲調:ma = má = mǎ = mà
SECONDARYCollator.SECONDARY基礎 + 聲調/重音ma < má < mǎ < mà
TERTIARYCollator.TERTIARY基礎 + 聲調 + 大小寫/寬窄全角/半角、大小寫區分
IDENTICALCollator.IDENTICAL所有差異(含控制字符)最嚴格,極少用
<dependency>
    <groupId>com.ibm.icu</groupId>
    <artifactId>icu4j</artifactId>
    <version>74.2</version>
</dependency>
import com.ibm.icu.text.Collator;
import com.ibm.icu.util.ULocale;

Collator strokeCollator = Collator.getInstance(ULocale.CHINA);
strokeCollator.setAttribute(UCollAttribute.COLLATION_STRENGTH, UCollAttributeValue.SECONDARY);
// 設置為筆畫排序(需 CLDR 數據支援,具體屬性視 ICU 版本)
// ICU 也支援部首排序、拼音+筆畫混合排序

性能優化:緩存 Collator 實例

  • `Collator.getInstance()` 較重,**靜態單例**或**ThreadLocal** 復用。
  • 比較器實例化一次,排序多次復用。

完整實戰範例:圖書管理系統中文排序

@Component
public class BookSortService {
    private static final Collator PINYIN_COLLATOR = Collator.getInstance(Locale.CHINA);
    private static final Collator STROKE_COLLATOR = initStrokeCollator(); // ICU4J

    public List sortByPinyin(List books) {
        return books.stream()
                .sorted(Comparator.comparing(Book::getName, PINYIN_COLLATOR))
                .collect(Collectors.toList());
    }

    public List sortByStroke(List books) {
        return books.stream()
                .sorted(Comparator.comparing(Book::getName, STROKE_COLLATOR))
                .collect(Collectors.toList());
    }

    // 支援多字段:書名拼音升序 + 出版社筆畫降序
    public List sortMulti(List books) {
        return books.stream()
                .sorted(Comparator
                        .comparing(Book::getName, PINYIN_COLLATOR)
                        .thenComparing(Book::getPublisher, Comparator.comparing(s -> s, STROKE_COLLATOR).reversed()))
                .collect(Collectors.toList());
    }
}

避坑指南

問題原因解決
排序結果不符預期Locale 錯誤(用了 US/默認)強制 `Locale.CHINA` 或 `Locale.TAIWAN`
大數據量排序慢重複創建 Collator / 比較器單例複用、預提取排序鍵
數字/英文夾雜排序亂序Collator 預設 Unicode 碼點序預處理:數字補零、英文統一大小寫、或分組排序
簽名衝突Comparator.comparing 參數類型推導失敗顯式指定 `Comparator.comparing(Book::getName, (Collator) collator)`

總結

Java 原生 `Collator` 解決**拼音/聲調**排序;**筆畫/部首**需 ICU4J。核心模式:**單例 Collator + Comparator.comparing + Stream 排序**,簡潔高效,適配國際化業務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved