基于分组及组内不同日期字段的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
相关产品推荐
相关产品推荐

