【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 编码值 进行字符串比较:

java 复制代码
List<String> list = Arrays.asList("张三", "李四", "王五");
Collections.sort(list); // 默认排序方式

此时的排序结果可能是乱码或者无意义的顺序,因为它只是按字符的 Unicode 值排列。


3. ❓ 为什么需要 Collator

java.text.Collator 是 Java 提供的 本地化字符串比较工具类,支持中文、日文、韩文等语言规则的比较。

使用 Collator 可以实现:

  • 按拼音排序(中文首字母)
  • 支持不同 Locale(本地语言规则)

4. ✅ 使用 Collator 进行中文排序

基本示例:

java 复制代码
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 → Z

        System.out.println(names);
    }
}

5. 🔼 升序 vs 🔽 降序排序

升序(拼音从 A → Z):

java 复制代码
list.sort((a, b) -> Collator.getInstance(Locale.CHINA).compare(a, b));

降序(拼音从 Z → A):

java 复制代码
list.sort((a, b) -> Collator.getInstance(Locale.CHINA).compare(b, a));

记忆技巧compare(a, b) 表示"a 和 b 谁更小",如果返回负数表示 a 更小,应该排前面;若返回正数表示 a 更大,应该排后面。


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

如果你有如下对象:

java 复制代码
class Person {
    private String name;
    public String getName() { return name; }
}

你可以按 name 字段排序:

升序:

java 复制代码
list.sort((o1, o2) ->
    Collator.getInstance(Locale.CHINA).compare(o1.getName(), o2.getName()));

降序:

java 复制代码
list.sort((o1, o2) ->
    Collator.getInstance(Locale.CHINA).compare(o2.getName(), o1.getName()));

7. 🌈 多字段排序示例

如果你想先按姓名拼音降序,再按时间升序,可以这样写:

java 复制代码
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. 🧪 附录:完整中文排序对象示例

java 复制代码
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; }

    @Override
    public 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);
    }
}
相关推荐
叶小鸡2 分钟前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手18 分钟前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
我的xiaodoujiao29 分钟前
API 接口自动化测试详细图文教程学习系列16--项目实战演练3
python·学习·测试工具·pytest
juniperhan32 分钟前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_1800790547333 分钟前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路1 小时前
C++23概述
java·c++·c++23
时空系1 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
专注API从业者2 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
CHANG_THE_WORLD2 小时前
python 批量终止进程exe
开发语言·python
摇滚侠2 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql