当前位置: 首页 > ops >正文

【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.xdnf.cn/news/7755.html

相关文章:

  • Linux系统下nslookup命令的基本使用
  • Python爬虫(32)Python爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战
  • Python包管理工具uv 国内源配置
  • 网感驱动下开源AI大模型AI智能名片S2B2C商城小程序源码的实践路径研究
  • 【数据结构 · 初阶】- 快速排序
  • 基于双通道频谱分析的振动信号故障诊断3
  • Microbiome医口经典思路:退烧药物代谢过程如何进行多组学分析?
  • wps编辑技巧
  • 算子窗口操作
  • 如何使用redis做限流(golang实现小样)
  • 软考 系统架构设计师系列知识点之杂项集萃(66)
  • 信息学奥赛一本通 1853:【08NOIP提高组】传纸条 | 洛谷 P1006 [NOIP 2008 提高组] 传纸条
  • 软件测试知识详解
  • 微服务中API网关作用(统一入口、路由转发、协议转换、认证授权、请求聚合、负载均衡、熔断限流、监控日志)
  • AI护航化工:《山西省危化品视频智能分析指南》下的视频分析重构安全体系
  • elementui初学1
  • Rocky Linux 8.9 升级至 8.10 测试可通过以下步骤完成
  • Ubuntu20.04部署KVM
  • Android Binder线程池饥饿与TransactionException:从零到企业级解决方案(含实战代码+调试技巧)
  • NSSCTF [HGAME 2023 week1]easy_overflow
  • Dify的大语言模型(LLM) AI 应用开发平台-本地部署
  • MySQL中的JSON_CONTAINS函数用法
  • 自动驾驶中的预测控制算法:用 Python 让无人车更智能
  • 微软正式发布 SQL Server 2025 公开预览版,深度集成AI功能
  • 基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析实践技术应用
  • VLM-MPC:自动驾驶中模型预测控制器增强视觉-语言模型
  • Open CASCADE学习|刚体沿曲线运动实现方法
  • 高并发架构设计之限流
  • 【初识】内网渗透——基础概念,基本工具使用
  • 用户栈的高效解析逻辑