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

基于分组及组内不同日期字段的Case对象列表排序方案求助

解决Case对象列表的条件排序问题

我来帮你搞定这个排序需求~你的核心问题是原来的代码没有根据status的不同选择对应的日期字段排序,导致Deleted分组内的顺序不符合预期。下面给你两种可行的解决方案:

方案一:链式Comparator(简洁风格)

利用Java 8的Comparator链式调用,结合三元表达式根据status动态选择排序字段,同时指定降序规则:

cases.sort(Comparator.comparing(Case::getStatus)
        // 第一步:按status排序,Active默认排在Deleted前面(因为"A"的ASCII码小于"D")
        .thenComparing(c -> "Active".equals(c.getStatus()) ? c.getStartedDate() : c.getDeletedDate(),
                // 第二步:根据status选择对应日期字段,统一降序排序
                Comparator.reverseOrder()));

方案二:自定义比较器(直观风格)

如果觉得链式调用不够直观,可以写一个自定义的比较器,分步处理排序逻辑:

cases.sort((c1, c2) -> {
    // 1. 优先比较status
    int statusDiff = c1.getStatus().compareTo(c2.getStatus());
    if (statusDiff != 0) {
        return statusDiff;
    }
    
    // 2. 同status时,按对应日期降序排序
    if ("Active".equals(c1.getStatus())) {
        // Active分组:startedDate降序(用c2.compareTo(c1)实现反转)
        return c2.getStartedDate().compareTo(c1.getStartedDate());
    } else {
        // Deleted分组:deletedDate降序
        return c2.getDeletedDate().compareTo(c1.getDeletedDate());
    }
});

为什么原来的代码不对?

你之前的代码thenComparing(Case::getCreatedDate).reversed().thenComparing(Case::getDeletedDate).reversed()逻辑混乱:

  • 不管status是什么,先按createdDate降序,再按deletedDate降序,没有实现"Active用startedDate、Deleted用deletedDate"的分支逻辑
  • 多次reversed()会打乱整体排序优先级,导致结果不符合预期

验证结果

用这两种方案处理你的初始数据,都会得到你期望的排序结果:

Name, Created date, Status, Deleted date
xxx, 2019-01-01, Active, NULL
xxx, 2018-01-01, Active, NULL
xxx, 2018-01-01, Deleted, 2019-02-01
xxx, 2019-01-01, Deleted, 2018-02-01

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:03:15