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

如何在Java中先按属性升序再按另一属性降序排序对象列表?

实现先按属性升序、再按另一属性降序的排序

你当前的问题在于调用了整个比较器链的reversed()方法——这个操作会把整条排序规则完全反转,包括原本的age升序也变成了降序,所以才得到不符合预期的结果。

要实现「age升序,name降序」的需求,只需要单独反转第二个属性的比较规则即可,有两种简洁的实现方式:

方式一:对第二个属性的比较器单独反转

直接在thenComparing中传入一个已反转的name比较器:

var sortedPeople = people
    .stream()
    .sorted(
        Comparator
            .comparing(Person::getAge) // age升序
            .thenComparing(Comparator.comparing(Person::getName).reversed()) // name降序
    )
    .toList();

方式二:使用thenComparing的重载方法

利用thenComparing的重载版本,直接传入属性提取函数和反向比较器:

var sortedPeople = people
    .stream()
    .sorted(
        Comparator
            .comparing(Person::getAge) // age升序
            .thenComparing(Person::getName, Comparator.reverseOrder()) // name降序
    )
    .toList();

运行修改后的代码,就能得到你想要的结果:

(25, David), (25, Bob), (25, Alice), (30, Eve), (30, Charlie)

为什么原来的代码不行?

你之前的代码是先构建了「age升序 → name升序」的比较器链,再调用reversed(),这会把整条规则反转,变成「age降序 → name降序」,自然不符合需求。而上面两种方法都只针对第二个属性的排序规则做反转,第一个属性的升序规则保持不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:57:15