如何根据 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
)。
我正在获取订单列表并将对象存储在列表中。该对象有一个名为 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
)。