You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何按不同升降序规则对列表多字段进行排序

Java多字段组合排序实现方案

假设存储元素的自定义类为MyObj,三个字段a、b、c均已实现Comparable接口(如Integer、String等常用类型默认已实现),以下是两种通用实现方式:

Java 8及以上版本(推荐)

使用JDK自带的Comparator链式API编写,可读性高且不容易出错:

// 核心排序代码
list.sort(Comparator.comparing(MyObj::getA)
        // 注意:需要单独对b字段的比较器执行反转,不能在整个链式调用末尾加reversed,否则会把前面的排序规则一起反转
        .thenComparing(Comparator.comparing(MyObj::getB).reversed())
        .thenComparing(MyObj::getC));

你之前降序逻辑不生效大概率是踩了「全局反转」的坑,只有把b字段的比较逻辑单独包裹后反转,才能实现仅b字段降序的效果。

Java 8以下版本

手动实现Comparator接口自定义比较逻辑:

Collections.sort(list, new Comparator<MyObj>() {
    @Override
    public int compare(MyObj o1, MyObj o2) {
        // 第一步:a字段升序比较
        int aCompareRes = o1.getA().compareTo(o2.getA());
        if (aCompareRes != 0) {
            return aCompareRes;
        }
        // 第二步:a相同则b字段降序比较,交换o1和o2的比较顺序即可实现降序
        int bCompareRes = o2.getB().compareTo(o1.getB());
        if (bCompareRes != 0) {
            return bCompareRes;
        }
        // 第三步:b也相同则c字段升序比较
        return o1.getC().compareTo(o2.getC());
    }
});

降序逻辑的核心原理:默认compare方法返回负数时o1排在o2前面,升序逻辑下o1属性小于o2时返回负数,要实现降序只需要把比较结果取反,或者交换两个对象的比较顺序即可。


内容的提问来源于stack exchange,提问作者pinux10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:09:03