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

如何对含a、b、c属性的对象列表排序,使首位为a/b最大且c最小的元素?

解决List的自定义排序问题

问题分析

你需要的排序规则是优先让元素的a、b最大值尽可能大(降序),当a、b最大值相同时,让c的值尽可能小(升序),最终让排序后的列表第一个元素满足这两个条件。

你之前的代码存在两个核心问题:

  • 语法错误:lambda表达式未闭合括号,且没有返回符合Comparator要求的int类型比较结果(负数/0/正数)
  • 逻辑错误:表达式Math.max(p1.getValueA, Math.min(p1.getValueB, p2.getValueC))完全不符合排序逻辑,没有对两个元素的排序维度进行正确比较。

正确实现方式

方式1:Lambda表达式完整写法

直接在sort方法中编写清晰的比较逻辑:

mList.sort((p1, p2) -> {
    // 计算当前元素a和b的最大值
    int maxAB1 = Math.max(p1.getA(), p1.getB());
    int maxAB2 = Math.max(p2.getA(), p2.getB());
    
    // 第一步:按a、b的最大值降序排序
    int abComparison = Integer.compare(maxAB2, maxAB1);
    if (abComparison != 0) {
        return abComparison;
    }
    // 第二步:当a、b最大值相同时,按c的值升序排序
    return Integer.compare(p1.getC(), p2.getC());
});

方式2:Comparator链式写法(更简洁)

利用Java 8+的Comparator链式API,代码更紧凑:

mList.sort(Comparator.comparingInt((Values v) -> Math.max(v.getA(), v.getB()))
                     .reversed() // 反转顺序,实现降序
                     .thenComparingInt(Values::getC)); // 后续按c升序排序

代码说明

  • 两种写法的逻辑完全一致:先以max(a,b)为第一排序维度,降序排列;当max(a,b)相同时,以c为第二维度,升序排列。
  • 排序后,列表的第一个元素必然是所有元素中max(a,b)最大的;若存在多个max(a,b)相同的元素,则取其中c最小的那个。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:40:55