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

Flutter/Dart如何按订单配送时间对对象列表进行升序排序

解决方案

直接使用Dart List内置的sort方法自定义排序规则即可,不需要单独提取时间做冒泡排序,实现更简洁也不会丢失重复时间的订单。
排序规则约定(可根据业务调整优先级):

  • 所有deliveryTime为null或"ASAP"的订单排在列表最前面
  • 剩余订单按deliveryTime转换后的时间升序排列

确保你已经导入package:intl/intl.dart,完整实现代码如下:

List<OnlineDeliveryOrder> getSortedOrdersList(List<OnlineDeliveryOrder> orderList) {
  // 拷贝原列表避免修改传入的原始数组
  List<OnlineDeliveryOrder> sortedList = List.from(orderList);
  final dateFormat = DateFormat('hh:mm a');

  sortedList.sort((a, b) {
    // 优先级标记:0=ASAP/Null(前置),1=正常时间
    int priorityA = (a.deliveryTime == null || a.deliveryTime == "ASAP") ? 0 : 1;
    int priorityB = (b.deliveryTime == null || b.deliveryTime == "ASAP") ? 0 : 1;

    // 优先级不同时直接按优先级排序
    if (priorityA != priorityB) {
      return priorityA.compareTo(priorityB);
    }

    // 都是ASAP/Null,保持原有相对顺序
    if (priorityA == 0) {
      return 0;
    }

    // 都是正常时间,转DateTime后比较
    try {
      DateTime timeA = dateFormat.parse(a.deliveryTime!);
      DateTime timeB = dateFormat.parse(b.deliveryTime!);
      return timeA.compareTo(timeB);
    } catch (e) {
      // 时间格式异常的订单排在当前分组末尾
      return 1;
    }
  });

  print("List Length after Sort: ${sortedList.length}");
  return sortedList;
}

如果一定要沿用你当前的冒泡排序思路,需要修复两个核心问题:

  • 不要对sortedTimeList做toSet()去重,否则相同时间的多个订单无法匹配
  • 先把所有null/"ASAP"的订单加入结果列表,再遍历排序后的时间列表,逐个匹配对应时间的订单加入结果
    但这种方法需要两次遍历列表,还存在重复时间匹配的冗余逻辑,不如自定义sort的方案高效可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:18:02