如何根据 dart、Flutter 中订单的交货时间对元素列表进行排序?

How do I sort a list of element according to Delivery time of the orders in dart, Flutter?

我正在获取订单列表并将对象存储在列表中。该对象有一个名为 String deliveryTime 的 属性,时间采用 'hh:mm a' 格式。我想按对象的交付时间按升序对列表进行排序。我创建了一个只有 deliveryTime 的字符串列表,并使用冒泡排序按升序对它们进行排序。但是我无法按该顺序对整个对象列表进行排序。

注意:对象列表有一些 null"ASAP" 作为它们的 deliveryTime 值。

这是不完整的代码:

List<OnlineDeliveryOrder> getSortedOrdersList(
    List<OnlineDeliveryOrder> orderList,
  ) {
    List<OnlineDeliveryOrder> tempOrderList = [];
    List<DateTime> sortedTimeList = [];
    print("List Length before Sort: " + orderList.length.toString());

    orderList.forEach((OnlineDeliveryOrder order) {
      if (order.deliveryTime != null && order.deliveryTime != "ASAP")
        sortedTimeList.add(DateFormat('hh:mm a').parse(order.deliveryTime));
    });

    sortedTimeList =
        sortedTimeList.toSet().toList(); //Taking the unique times only

    //Sorting times in asc order using bubble sort algorithm
    bool sorted = false;
    while (!sorted) {
      sorted = true;
      for (int i = 0; i < sortedTimeList.length - 1; i++) {
        DateTime tempTime;
        if (sortedTimeList[i].compareTo(sortedTimeList[i + 1]) == 1) {
          // dt1.compareTo(dt2) == 1 if dt1 is a later date than dt2
          tempTime = sortedTimeList[i];
          sortedTimeList[i] = sortedTimeList[i + 1];
          sortedTimeList[i + 1] = tempTime;
          sorted = false;
        }
      }
    }

    // HOW DO I SORT THE ENTIRE LIST
    
    print("List Length after Sort: " + tempOrderList.length.toString());
    // String time = DateFormat('hh:mm a').format(element);

    return tempOrderList;
  }

任何人都可以指导我如何 return 排序列表吗?

为什么要自己实现一个O(n^2)时间复杂度的排序算法? 你可以使用

List<OnlineDeliveryOrder> getSortedOrdersList(List<OnlineDeliveryOrder> orderList){
    var format = DateFormat('hh:mm a');
    return List.of(orderList)..sort((a,b){
        if(a.deliveryTime == null) return 1;
        if(b.deliveryTime == null) return -1;
        if(a.deliveryTime == 'ASAP') return 1;
        if(b.deliveryTime == 'ASAP') return -1;
        return format.parse(a.deliveryTime).compareTo(format.parse(b.deliveryTime));
    });
}

这样,首先所有对象都带有有效日期,然后带有 'ASAP',然后带有 null 作为 deliveryTime

或者如果你想在没有任何包的情况下更高效:

class SortObject extends Comparable<SortObject>{
   static final DateFormat format = DateFormat('hh:mm a');
   final OnlineDeliveryOrder order;
   final DateTime? deliveryTime;

   SortObject(this.order):this.deliveryTime=order.deliveryTime==null||order.deliveryTime=='ASAP'?null:format.parse(order.deliveryTime);

   int compareTo(SortObject other){
            if(order.deliveryTime == null) return 1;
            if(other.order.deliveryTime == null) return -1;
            if(order.deliveryTime == 'ASAP') return 1;
            if(other.order.deliveryTime == 'ASAP') return -1;
            return deliveryTime!.compareTo(other.deliveryTime!);
   }
}

List<OnlineDeliveryOrder> getSortedOrdersList(List<OnlineDeliveryOrder> orderList){
    return (orderList.map((a)=>SortObject(a)).toList()..sort((a,b){
        return a.compareTo(b);
    })).map((a)=>a.order).toList();
}

还是我答错了? 如果代码中有错误,我深表歉意。我刚刚写下来了。

我建议您在 OnlineDeliveryOrder class 中添加另一个存储 DateTime 的属性,除了 deliveryTime 之外,它作为 String ].或者您可以只将时间存储为 DateTime 而不是 String。如果您收到的数据为 JSON,这很容易做到。 (这样你就不需要额外的 class 或 GroupedList)。