【JAVA】中文我该怎么排序?
📘 Java 中文排序教学文档(基于 Collator)
🧠 目录
- 概述
- Java 中字符串排序的默认行为
- 为什么需要 Collator
- 使用 Collator 进行中文排序
- 升序 vs 降序排序
- 自定义对象字段排序
- 多字段排序示例
- 总结对比表
- 附录:完整代码示例
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);}
}
相关文章:
【JAVA】中文我该怎么排序?
📘 Java 中文排序教学文档(基于 Collator) 🧠 目录 概述Java 中字符串排序的默认行为为什么需要 Collator使用 Collator 进行中文排序升序 vs 降序排序自定义对象字段排序多字段排序示例总结对比表附录:完整代码示例 …...

《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》
目录 七. strncpy函数的使用与模拟实现 7.1 strncpy函数理解 7.2 strncpy函数使用示例 7.3 strncpy函数模拟实现 八. strncat函数的使用与模拟实现 8.1 strncat函数理解 8.2 strncat函数使用示例 8.3 strncat函数模拟实现 九. strncmp函数的使用 9.1 strncmp函数理…...

百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%
百度飞桨 PaddleOCR 3.0 开源发布 2025 年 5 月 20 日,百度飞桨团队正式发布了 PaddleOCR 3.0 版本,并将其开源。这一新版本在文字识别精度、多语种支持、手写体识别以及高精度文档解析等方面取得了显著进展,进一步提升了 PaddleOCR 在 OCR …...

Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用
一、FPGA 在线升级 FPGA 在线升级FLASH时,一般是通过逻辑生成SPI接口操作FLASH,当然也可以通过其他SOC经FPGA操作FLASH,那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA,只有CCLK是专用引脚,SPI接口均为普…...

数字孪生驱动的离散制造智能升级:架构设计与工程实践
针对离散制造行业多品种、小批量的生产特性,本文提出一种基于数字孪生的智能制造解决方案。以某国家级智能制造试点示范项目为载体,构建"云-边-端"协同的数字孪生系统,实现设备综合效率(OEE)提升28.7%、订单…...

9.4在 VS Code 中配置 Maven
在 VS Code 中配置 Maven 需要完成 Maven 环境安装 一、安装 Maven(如果未安装) 下载 Maven 访问 Apache Maven 官网,下载最新版本的 Maven(如apache-maven-3.9.9-bin.zip)。 解压文件 将下载的 ZIP 文件解压到本地目…...
mmaction2——tools文件夹下
build_rawframes.py 用法示例 python tools/data/build_rawframes.py data/videos data/frames --task rgb --level 2 --ext mp4 --use-opencv --num-worker 8总结: 只需要 RGB 帧,推荐 --use-opencv,简单高效,无需额外依赖。 …...

新能源汽车充电桩资源如何利用资源高效配置?
新能源汽车充电桩资源的高效配置是实现绿色交通转型的关键环节。随着新能源汽车保有量的快速增长,充电基础设施的供需矛盾日益凸显。如何优化充电桩资源布局、提升使用效率、平衡不同场景需求,成为当前亟待解决的问题。以下是几点关于充电桩资源高效配置…...
python 程序实现了毫米波大规模MIMO系统中的信道估计对比实验
python 程序实现了毫米波大规模MIMO系统中的信道估计对比实验 import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.models import Sequential, Model from tensorflow.keras.layers...
NTFS0x90属性和0xa0属性和0xb0属性的一一对应关系是index_entry中的index_node中VCN和runlist和bitmap
第一部分: 0: kd> dt _FILE_RECORD_SEGMENT_HEADER 0xc1241400 Ntfs!_FILE_RECORD_SEGMENT_HEADER 0x000 MultiSectorHeader : _MULTI_SECTOR_HEADER 0x008 Lsn : _LARGE_INTEGER 0x80e74aa 0x010 SequenceNumber : 5 0x012 Referen…...
PDF 编辑批量拆分合并OCR 识别
各位办公小能手们!你们有没有过被PDF文件折磨得死去活来的经历?反正我是有,每次要编辑PDF,那叫一个费劲啊!不过呢,今天我要给大家介绍一款神器——WPS PDF to Word,有了它,PDF编辑那…...

LeetCode --- 450周赛
题目列表 3550. 数位和等于下标的最小下标 3551. 数位和排序需要的最小交换次数 3552. 网格传送门旅游 3553. 包含给定路径的最小带权子树 II 一、数位和等于下标的最小下标 直接模拟计算数位和即可,代码如下 // C class Solution { public:int smallestIndex(ve…...

SpringBoot中消息转换器的选择
SpringBoot返回xml-CSDN博客 是返回JSON 还是XML 是由内容协商机制确认的,SpringBoot为了开发便利性,如果我没有该消息转换器,默认就返回了JSON,如果需要XML那么,引入 <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>…...
(初级)前端初学者入门指南:HTML5与CSS3核心知识详解
对于前端初学者来说,掌握HTML5和CSS3的基础知识是构建现代化网页的第一步。本文将围绕语义化标签、多媒体嵌入、盒模型、Flexbox布局和Grid布局五大核心知识点展开,通过代码示例和详细解析帮助大家快速上手。 一、HTML5:从结构到交互的革新 …...

基于点标注的弱监督目标检测方法研究
摘要 在计算机视觉领域,目标检测需要大量精准标注数据,但人工标注成本高昂。弱监督目标检测通过低成本标注训练模型,成为近年研究热点。本文提出一种基于点标注的弱监督目标检测算法,仅需在图像中物体中心点标注,即可高…...
【RichTextEditor】 【分析2】RichTextEditor设置文字内容背景色
【RichTextEditor】 【分析2】RichTextEditor设置文字内容背景色 都说AI Coder的Cursor很牛,也付费用了, 但这个背景色,搞了一天也没改过来。 最后,让它分析该控件的层次结构及文本内容显示的位置。 然后,搞定&#…...

超越OpenAI CodeX的软件工程智能体:Jules
目前AI编码代理(coding agent)领域正迅速崛起,Google推出了一款名为Jules的非同步编码代理(asynchronous coding agent),主要针对专业开发者,与传统在开发环境中直接辅助编码的Cursor或Windsurf…...
Qt实战教程:设计并实现一个结构清晰、功能完整的桌面应用
概述 本文以文本编辑器项目作为示例,文本编辑器是一个非常适合新手入门的经典项目。它具备了桌面应用开发中的核心要素: 窗口管理菜单栏和工具栏文件操作(打开、保存)多文档支持(可选)国际化支持(多语言)插件系统(进阶扩展)通过这个项目,你将学习到如何使用Qt进行桌…...

轻量化MEC终端 特点
MEC(多接入边缘计算)解决方案通过将计算能力下沉至网络边缘,结合5G网络特性,已在多个行业实现低延迟、高可靠、高安全的应用部署。以下从技术架构、核心优势及典型场景三方面进行总结: 一、技术架构 分层设计 MEC架…...

NIST提出新型安全指标:识别潜在被利用漏洞
美国国家标准与技术研究院(NIST)近日公布了一项突破性的安全指标,旨在评估哪些软件漏洞可能已被利用——即使相关组织尚未察觉。 这项由前NIST专家Peter Mell和网络安全与基础设施安全局(CISA)Jonathan Spring共同完成…...

List介绍
什么是List 在集合框架中,List是一个接口,继承自Collection Collection也是一个接口,该接口中规范了后序容器中常用的一些方法 Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下࿱…...

正则表达式全解:一文学会正则表达式【附在线正则表达式练习网站】
1.正则表达式的作用 案例演示 先给大家看一个例子,在以下文本中存储了一些职位信息: Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员 测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员 Python3 …...

Nginx-详解(二)
nginx 常见模块 第三方模块是对nginx 的功能扩展,第三方模块需要在编译安装nginx 的时候使用参数-- add-modulePATH指定路径添加,有的模块是由公司的开发人员针对业务需求定制 开发的,有的模块是开源爱好者开发好之后上传到github进行开源的…...
解决 IntelliJ IDEA 配置文件中文被转义问题
在使用 IntelliJ IDEA 进行开发时,我们经常需要编辑各种配置文件(如 .properties、.xml、.json 等)。然而,许多开发者都遇到过这样的困扰:配置文件中的中文内容被自动转义成了 Unicode 编码,显示为类似 \u4…...

MCP、MCPHub、A2A、AG-UI概述
MCP Model Context Protocol,模型上下文协议,Anthropic于2024年开源的标准协议,旨在统一AI模型与数据源的交互方式,提升数据访问的便捷性和可靠性,提供标准化的工具调用、资源管理和提示词功能。 MCP的基本定义&…...
计算机视觉与深度学习 | Python实现CEEMDAN-ISOS-VMD-GRU-ARIMA时间序列预测(完整源码和数据)
以下是结合CEEMDAN、ISOS-VMD、GRU和ARIMA的时间序列预测的Python完整实现方案。本方案包含完整的代码、数据生成逻辑和实现细节说明。 完整代码实现 import numpy as np import pandas as pd from PyEMD import CEEMDAN from vmdpy import VMD from scipy.optimize import di…...

[Linux]磁盘分区及swap交换空间
linux磁盘分区 计算机容量单位:一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示。 它们之间的关系是: 1KB (Kilobyte 千字节)1024B, 1MB (Megabyte 兆…...
JAVA面向对象——对象和类的基本语法
JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型:变量(如 int max 15;)。数据结构:数组(一维/二维)、对象(特殊数据结构,用于存储复…...

Linux常见指令合集+知识点
Linux有一条设计理念:Linux中一切皆文件;这样的设计理念让Linux可以用一种统一的方式对Linux中的不同文件/设备进行管理;(也就是键盘、显示器等在Linux中也算文件) 文件内容属性,指令一般都是对文件进行操…...

nginx 基于IP和用户的访问
nginx的下载 yum install nginx.x86_64 -y 启动服务 systemctl enable --now nginx.service 查看服务目录 [rootwebserver ~]# rpm -ql nginx /usr/bin/nginx-upgrade /usr/lib/systemd/system/nginx.service /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx…...