【JAVA】中文我該怎么排序?


📘 Java 中文排序教學文檔(基于 Collator)


🧠 目錄

  1. 概述
  2. Java 中字符串排序的默認行為
  3. 為什么需要 Collator
  4. 使用 Collator 進行中文排序
  5. 升序 vs 降序排序
  6. 自定義對象字段排序
  7. 多字段排序示例
  8. 總結對比表
  9. 附錄:完整代碼示例

1. 📌 概述

Java 的 List.sort() 方法通過傳入一個比較器(Comparator),決定集合中元素的排列順序。但 Java 默認的字符串比較并不能正確排序中文(尤其是按拼音順序),這就需要使用 Collator 來實現符合中文語義的排序方式。


2. 🔍 Java 中字符串排序的默認行為

Java 默認使用 Unicode 編碼值 進行字符串比較:

List<String> list = Arrays.asList("張三", "李四", "王五");
Collections.sort(list); // 默認排序方式

此時的排序結果可能是亂碼或者無意義的順序,因為它只是按字符的 Unicode 值排列。


3. ? 為什么需要 Collator

java.text.Collator 是 Java 提供的 本地化字符串比較工具類,支持中文、日文、韓文等語言規則的比較。

使用 Collator 可以實現:

  • 按拼音排序(中文首字母)
  • 支持不同 Locale(本地語言規則)

4. ? 使用 Collator 進行中文排序

基本示例:

import java.text.Collator;
import java.util.*;public class ChineseSortExample {public static void main(String[] args) {List<String> names = Arrays.asList("張三", "李四", "王五");Collator collator = Collator.getInstance(Locale.CHINA);names.sort(collator); // 升序:拼音 A → ZSystem.out.println(names);}
}

5. 🔼 升序 vs 🔽 降序排序

升序(拼音從 A → Z):

list.sort((a, b) -> Collator.getInstance(Locale.CHINA).compare(a, b));

降序(拼音從 Z → A):

list.sort((a, b) -> Collator.getInstance(Locale.CHINA).compare(b, a));

? 記憶技巧compare(a, b) 表示“a 和 b 誰更小”,如果返回負數表示 a 更小,應該排前面;若返回正數表示 a 更大,應該排后面。


6. 🧾 自定義對象字段排序(按對象中的中文字段)

如果你有如下對象:

class Person {private String name;public String getName() { return name; }
}

你可以按 name 字段排序:

升序:

list.sort((o1, o2) ->Collator.getInstance(Locale.CHINA).compare(o1.getName(), o2.getName()));

降序:

list.sort((o1, o2) ->Collator.getInstance(Locale.CHINA).compare(o2.getName(), o1.getName()));

7. 🌈 多字段排序示例

如果你想先按姓名拼音降序,再按時間升序,可以這樣寫:

list.sort((o1, o2) -> {Collator collator = Collator.getInstance(Locale.CHINA);int nameCompare = collator.compare(o2.getName(), o1.getName()); // 姓名降序if (nameCompare != 0) return nameCompare;return o1.getCreateTime().compareTo(o2.getCreateTime()); // 時間升序
});

8. 📊 總結對比表

方式寫法效果
默認排序Collections.sort(list)按 Unicode 排序,中文不正確
拼音升序compare(a, b)拼音 A → Z
拼音降序compare(b, a)拼音 Z → A
對象字段升序compare(o1.getField(), o2.getField())自定義字段排序
對象字段降序compare(o2.getField(), o1.getField())字段降序
多字段組合使用 if (result != 0) 判斷后繼續比較第二字段多條件排序

9. 🧪 附錄:完整中文排序對象示例

import java.text.Collator;
import java.util.*;class User {private String commitUser;private Date commitTime;public User(String commitUser, Date commitTime) {this.commitUser = commitUser;this.commitTime = commitTime;}public String getCommitUser() { return commitUser; }public Date getCommitTime() { return commitTime; }@Overridepublic String toString() {return commitUser + " - " + commitTime;}
}public class ChineseSort {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User("李四", new Date(100000)));users.add(new User("王五", new Date(50000)));users.add(new User("陳七", new Date(150000)));users.sort((o1, o2) -> {Collator collator = Collator.getInstance(Locale.CHINA);int nameCmp = collator.compare(o2.getCommitUser(), o1.getCommitUser()); // 名字降序if (nameCmp != 0) return nameCmp;return o1.getCommitTime().compareTo(o2.getCommitTime()); // 時間升序});users.forEach(System.out::println);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82254.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

k8s-NetworkPolicy

在 Kubernetes 中&#xff0c;NetworkPolicy 是一種資源對象&#xff0c;用于定義 Pod 之間的網絡通信策略。它允許你控制哪些 Pod 可以相互通信&#xff0c;以及如何通信。通過使用 NetworkPolicy&#xff0c;可以實現更細粒度的網絡訪問控制&#xff0c;增強集群的安全性。 1…

LAN(局域網)和WAN(廣域網)

你的問題非常清晰&#xff01;我來用一個直觀的比喻實際拓撲圖幫你徹底理解LAN&#xff08;局域網&#xff09;和WAN&#xff08;廣域網&#xff09;如何協同工作&#xff0c;以及路由器在其中的位置。你可以把整個網絡想象成一座城市&#xff1a; 1. 比喻&#xff1a;城市交通…

idea 插件開發自動發布到 nexus 私服中(腳本實例)

如下腳本內容為 idea 插件開發項目中的 build.gradle.kts 文件示例&#xff0c;其中自定了 updatePluginsXmlToNexus 和 uploadPluginToNexus 兩個任務&#xff0c;一個用來自動修改 nexus 中的配置文件&#xff0c;一個用來自動將當前插件打包后的 zip 文件上傳到 nexus 私服中…

SpringBoot-11-基于注解和XML方式的SpringBoot應用場景對比

文章目錄 1 基于注解的方式1.1 @Mapper1.2 @select1.3 @insert1.4 @update1.5 @delete2 基于XML的方式2.1 namespace2.2 resultMap2.3 select2.4 insert2.5 update2.6 delete3 service和controller3.1 service3.2 controller4 注解和xml的選擇如果SQL簡單且項目規模較小,推薦使…

C++復習核心精華

一、內存管理與智能指針 內存管理是C區別于其他高級語言的關鍵特性&#xff0c;掌握好它就掌握了C的靈魂。 1. 原始指針與內存泄漏 先來看看傳統C的內存管理方式&#xff1a; void oldWay() {int* p new int(42); // 分配內存// 如果這里發生異常或提前return&#xff0c…

期貨反向跟單軟件—提高盤手杠桿的方式及剖析

在期貨反向跟單領域&#xff0c;期貨跟單軟件對盤手杠桿的調節&#xff0c;是整個策略運作的核心環節之一。其背后蘊含著科學的金融邏輯。? 期貨跟單軟件提高盤手杠桿主要通過兩種方式。第一種是降低期貨保證金。在盤手資金總量固定的情況下&#xff0c;保證金降低&#xff0…

【計算機網絡】基于UDP進行socket編程——實現服務端與客戶端業務

&#x1f525;個人主頁&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收錄專欄&#x1f308;&#xff1a;Linux &#x1f339;往期回顧&#x1f339;&#xff1a; 【Linux筆記】——網絡基礎 &#x1f516;流水不爭&#xff0c;爭的是滔滔不息 一、UDPsocket編程UDPsocket編…

ae卡通打架煙霧特效

1、創建一個合成&#xff08;合成1&#xff09;&#xff0c;右鍵創建形狀圖層&#xff0c;使用橢圓工具&#xff0c;長按shift鍵拖動鼠標左鍵畫出圓形&#xff0c;同時按ctrlalthome三個鍵使圓形中心錨點對齊圓心&#xff0c;關閉描邊&#xff0c;圓形圖層填充白色。 2、選擇形…

UE5 Va Res發送請求、處理請求、json使用

文章目錄 介紹發送一個Get請求發送Post請求設置請求頭請求體帶添json發送請求完整的發送藍圖 處理收到的數據常用的json處理節點 介紹 UE5 自帶的Http插件&#xff0c;插件內自帶json解析功能 發送一個Get請求 只能寫在事件圖表里 發送Post請求 只能寫在事件圖表里 設置…

SQL 結構化模型設計與現代技術融合深度解讀

摘要 本文系統展示了基于 JSON Schema 的 SQL 結構化模型設計&#xff0c;包括通用定義、四大基本操作&#xff08;SELECT、INSERT、UPDATE、DELETE&#xff09;的模型規范&#xff0c;以及面向現代場景的設計擴展。重點結合數據權限控制、樂觀鎖并發控制、表單自動化、自定義…

el-dialog 組件 多層嵌套 被遮罩問題

<el-dialog title"提示" :visible.sync"dialogBindUserVisible" width"30%" append-to-body :before-close"handleClose"> <span>這是一段信息</span> <span slot"footer" class"dialog-footer&q…

【KWDB 2025 創作者計劃】_KWDB時序數據庫特性及跨模查詢

一、概述 數據庫的類型多種多樣&#xff0c;關系型數據庫、時序型數據庫、非關系型數據庫、內存數據庫、分布式數據庫、圖數據庫等等&#xff0c;每種類型都有其特定的使用場景和優勢&#xff0c;KaiwuDB 是一款面向 AIoT 場景的分布式、多模融合、支持原生 AI 的數據庫…

學習心得(12-13)HTML 是什么 abort函數and自定義異常

一. abort函數 將后端的數據給到前端 二. 自定義異常 要結合abort函數使用 1.編寫的時候都在abort的函數這個文件里面 錯誤信息在前端頁面的展示&#xff1a; 如果想要在出現異常的時候返回一個頁面&#xff1a; 1. 新建一個HTML文件 例如命名為404 2.將圖庫里的圖片拖入…

理解全景圖像拼接

1 3D到2D透視投影 三維空間上點 p 投影到二維空間 q 有兩種方式&#xff1a;1&#xff09;正交投影&#xff0c;2&#xff09;透視投影。 正交投影直接舍去 z 軸信息&#xff0c;該模型僅在遠心鏡頭上是合理的&#xff0c;或者對于物體深度遠小于其到攝像機距離時的近似模型。…

Linux基本指令篇 —— whoami指令

whoami 是 Linux 和 Unix 系統中一個簡單但實用的命令&#xff0c;全稱 Who Am I&#xff08;我是誰&#xff09;。它的功能是顯示當前登錄用戶的用戶名。以下是關于 whoami 的詳細解析&#xff1a; 目錄 1. 基本用法 2. 命令特點 3. 實際應用場景 場景 1&#xff1a;腳本中…

華為OD機試真題——仿LISP運算(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

創建dummy

訪客_dc1fc4 class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int left0;int right0;int n nums.size(); int sum0;int ans100001; for(right0;right<n;right) { sumnums[right]; //每次更新右端點之后&#xff0c;立即向右移動…

面向惡劣條件的道路交通目標檢測----大創自用(當然你也可以在里面學到很多東西)

全部內容梳理 目標檢測的兩個任務&#xff1a; 預測標簽 邊界框 語義分割 實力分割 一個是類別 一個是實例級別 分類任務把每個圖像當作一張圖片看待 所有解決方法是先生成候選區域 再進行分類 置信度&#xff1a; 包括對類別和邊界框預測的自信程度 輸出分類和IOU分數的…

需求管理工具使用不當,如何優化?

要優化需求管理工具的使用&#xff0c;需從選擇合適工具、規范使用流程、加強用戶培訓、統一數據結構、定期審查與優化使用配置五個方面著手。其中&#xff0c;選擇合適工具是前提。錯誤的工具選擇往往會導致項目溝通效率低、需求追蹤失效甚至造成交付物偏離客戶預期。因此&…

openwrt虛擬機安裝調試

分類 lienol lean immortalwrt 一、獲取固件 &#xff08;1&#xff09;下載地址 1.官網構建下載 OpenWrt Firmware Selector 官網 OpenWrt Firmware Selector 2.第三方構建網站 ImmortalWrt Firmware Selector ImmortalWrt Firmware Selector 3.第三方構建下載 ht…