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
相关产品推荐
相关产品推荐

