自定义规则排序记录问题:现有Comparator实现不符合预期求优化方案
问题排查
原有代码存在以下核心问题:
- 变量拼写不统一,未赋值就直接返回
compareVal,存在运行时异常风险 - 跨类型(有/无DeliveredDate)记录比较逻辑错误,没有统一的排序基准日期判定规则
- 缺失边界场景处理,比如无DeliveredDate的记录中一方缺少orderedDate的情况
实现逻辑
按照需求,统一为每条记录计算排序基准日期:存在DeliveredDate时优先取DeliveredDate,不存在则取orderedDate,再按以下优先级依次比较:
- 排序基准日期升序
- 同基准日期下,有DeliveredDate的记录优先级高于无DeliveredDate的记录
- 同是有DeliveredDate的记录,按DeliveredTime升序
- 同是无DeliveredDate的记录,按orderTime升序
正确代码实现
@Override public int compare(Order o1, Order o2) { // 计算两条记录的排序基准日期 LocalDate o1BaseDate = o1.getDeliveredDate() != null ? o1.getDeliveredDate() : o1.getOrderedDate(); LocalDate o2BaseDate = o2.getDeliveredDate() != null ? o2.getDeliveredDate() : o2.getOrderedDate(); // 第一步:比较基准日期 int dateCompare = o1BaseDate.compareTo(o2BaseDate); if (dateCompare != 0) { return dateCompare; } // 第二步:同基准日期下,有配送日期的排在前面 boolean o1HasDelivered = o1.getDeliveredDate() != null; boolean o2HasDelivered = o2.getDeliveredDate() != null; if (o1HasDelivered != o2HasDelivered) { return o1HasDelivered ? -1 : 1; } // 第三步:同类型记录按对应时间排序,增加空值兼容逻辑 if (o1HasDelivered) { LocalTime t1 = o1.getDeliveredTime(); LocalTime t2 = o2.getDeliveredTime(); if (t1 == null && t2 == null) return 0; if (t1 == null) return 1; if (t2 == null) return -1; return t1.compareTo(t2); } else { LocalTime t1 = o1.getOrderTime(); LocalTime t2 = o2.getOrderTime(); if (t1 == null && t2 == null) return 0; if (t1 == null) return 1; if (t2 == null) return -1; return t1.compareTo(t2); } }
内容的提问来源于stack exchange,提问作者Selina
相关产品推荐
相关产品推荐

