当前位置: 首页 > 知识库问答 >
问题:

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

李胤
2023-03-14

我正在获取一个订单列表,并将对象存储在列表中。该对象有一个名为String DeliveryTime的属性,时间为'HH:MM a'格式。我想按对象的deliveryTime升序对列表进行排序。我创建了一个只有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;
  }

共有1个答案

彭展
2023-03-14

为什么要自己实现一个时间复杂度为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();
}
 类似资料: