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

自定义规则排序记录问题:现有Comparator实现不符合预期求优化方案

问题排查

原有代码存在以下核心问题:

  1. 变量拼写不统一,未赋值就直接返回compareVal,存在运行时异常风险
  2. 跨类型(有/无DeliveredDate)记录比较逻辑错误,没有统一的排序基准日期判定规则
  3. 缺失边界场景处理,比如无DeliveredDate的记录中一方缺少orderedDate的情况
实现逻辑

按照需求,统一为每条记录计算排序基准日期:存在DeliveredDate时优先取DeliveredDate,不存在则取orderedDate,再按以下优先级依次比较:

  1. 排序基准日期升序
  2. 同基准日期下,有DeliveredDate的记录优先级高于无DeliveredDate的记录
  3. 同是有DeliveredDate的记录,按DeliveredTime升序
  4. 同是无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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:24:03