WMX · 随记
·Java· 3 分钟阅读

Comparator 链式排序:相同分数还需要第二个键

排行榜只按分数排序,同分用户的次序可能让人困惑。稳定排序能保留输入顺序,但输入顺序本身未必稳定,尤其是来自数据库时。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Tutorial for Beginners

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

排行榜只按分数排序,同分用户的次序可能让人困惑。稳定排序能保留输入顺序,但输入顺序本身未必稳定,尤其是来自数据库时。

理解核心机制

使用 comparing 与 thenComparing 显式定义排序层次。reversed 放在整条链末尾会反转整套规则,放在某一比较器上则只反转局部。不要用整数相减构造比较结果,以免溢出。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java12 行 · 可横向滚动
import java.util.Comparator;
import java.util.List;
public class Demo {
    record Score(String name, int points) {}
    public static void main(String[] args) {
        var rows = new java.util.ArrayList<>(List.of(
            new Score("Bo", 10), new Score("Ada", 10), new Score("Cy", 8)));
        rows.sort(Comparator.comparingInt(Score::points).reversed()
            .thenComparing(Score::name));
        System.out.println(rows);
    }
}

适用边界与常见误区

字符串排序不是所有语言环境下的自然排序。若字段可能为 null,还要用 nullsFirst 或 nullsLast 明确策略。

继续练习

加入同分同名的重复行,讨论是否还需要稳定 ID 作为最终排序键;再分别反转第一层和整条比较链。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档