在飞镖中按工作日对地图进行排序
Sort map by weekdays in dart
我有一张工作日和时间的地图。但是我无法根据工作日对其进行排序,所以星期一排在第一位,然后是星期一。这是我的地图示例。我尝试了 SplayTreeMap 但我无法让它工作。
Map<String, dynamic> onlineVideoAppointment = {
'Mon': '12:00 AM-12:30 AM',
'Wed': '12:15 AM-1:15 AM',
'Sun': '12:00 AM-1:00 AM',
'Thu': '12:30 AM-1:30 AM',
'Tue': '12:15 AM-1:15 AM',
'Fri': '12:30 AM-1:00 AM',
'Sat': '12:00 AM-12:30 AM'
};
我决定从中获得乐趣并使用可迭代函数解决它。这是一个可运行的示例:
Map<String, dynamic> onlineVideoAppointment = {
'Mon': '12:00 AM-12:30 AM',
'Wed': '12:15 AM-1:15 AM',
'Sun': '12:00 AM-1:00 AM',
'Thu': '12:30 AM-1:30 AM',
'Tue': '12:15 AM-1:15 AM',
'Fri': '12:30 AM-1:00 AM',
'Sat': '12:00 AM-12:30 AM'
};
enum Day { sun, mon, tue, wed, thu, fri, sat }
extension DayX on Day {
String stringify() {
final clean = toString().substring(toString().indexOf('.') + 1);
return '${clean[0].toUpperCase()}${clean.substring(1)}';
}
}
void main() {
final sorted = Day.values.map((day) => onlineVideoAppointment.entries.firstWhere((entry) => entry.key == day.stringify()));
final sortedMap = Map<String, dynamic>.fromIterable(sorted, key: (appt) => appt.key, value: (appt) => appt.value);
print(sortedMap);
}
A SplayTreeMap
确实按键排序,但由于您的键是 String
,它会按字母顺序对它们排序。如果您改为使用 DateTime.monday
、DateTime.tuesday
等常量(碰巧已经从星期一开始)作为键,那么它将具有您想要的排序顺序。
如果你必须使用基于 String
的键,那么你只需要提供一种简单的方法将 String
转换为常量并提供适当的比较函数:
import 'dart:collection';
Map<String, String> onlineVideoAppointment = {
'Mon': '12:00 AM-12:30 AM',
'Wed': '12:15 AM-1:15 AM',
'Sun': '12:00 AM-1:00 AM',
'Thu': '12:30 AM-1:30 AM',
'Tue': '12:15 AM-1:15 AM',
'Fri': '12:30 AM-1:00 AM',
'Sat': '12:00 AM-12:30 AM'
};
const dayAbbreviationToValue = {
'Mon': DateTime.monday,
'Tue': DateTime.tuesday,
'Wed': DateTime.wednesday,
'Thu': DateTime.thursday,
'Fri': DateTime.friday,
'Sat': DateTime.saturday,
'Sun': DateTime.sunday,
};
void main() {
var sortedMap = SplayTreeMap.of(
onlineVideoAppointment,
(key1, key2) => dayAbbreviationToValue[key1]!
.compareTo(dayAbbreviationToValue[key2]!));
for (var entry in sortedMap.entries) {
print('${entry.key}: ${entry.value}');
}
}
我有一张工作日和时间的地图。但是我无法根据工作日对其进行排序,所以星期一排在第一位,然后是星期一。这是我的地图示例。我尝试了 SplayTreeMap 但我无法让它工作。
Map<String, dynamic> onlineVideoAppointment = {
'Mon': '12:00 AM-12:30 AM',
'Wed': '12:15 AM-1:15 AM',
'Sun': '12:00 AM-1:00 AM',
'Thu': '12:30 AM-1:30 AM',
'Tue': '12:15 AM-1:15 AM',
'Fri': '12:30 AM-1:00 AM',
'Sat': '12:00 AM-12:30 AM'
};
我决定从中获得乐趣并使用可迭代函数解决它。这是一个可运行的示例:
Map<String, dynamic> onlineVideoAppointment = {
'Mon': '12:00 AM-12:30 AM',
'Wed': '12:15 AM-1:15 AM',
'Sun': '12:00 AM-1:00 AM',
'Thu': '12:30 AM-1:30 AM',
'Tue': '12:15 AM-1:15 AM',
'Fri': '12:30 AM-1:00 AM',
'Sat': '12:00 AM-12:30 AM'
};
enum Day { sun, mon, tue, wed, thu, fri, sat }
extension DayX on Day {
String stringify() {
final clean = toString().substring(toString().indexOf('.') + 1);
return '${clean[0].toUpperCase()}${clean.substring(1)}';
}
}
void main() {
final sorted = Day.values.map((day) => onlineVideoAppointment.entries.firstWhere((entry) => entry.key == day.stringify()));
final sortedMap = Map<String, dynamic>.fromIterable(sorted, key: (appt) => appt.key, value: (appt) => appt.value);
print(sortedMap);
}
A SplayTreeMap
确实按键排序,但由于您的键是 String
,它会按字母顺序对它们排序。如果您改为使用 DateTime.monday
、DateTime.tuesday
等常量(碰巧已经从星期一开始)作为键,那么它将具有您想要的排序顺序。
如果你必须使用基于 String
的键,那么你只需要提供一种简单的方法将 String
转换为常量并提供适当的比较函数:
import 'dart:collection';
Map<String, String> onlineVideoAppointment = {
'Mon': '12:00 AM-12:30 AM',
'Wed': '12:15 AM-1:15 AM',
'Sun': '12:00 AM-1:00 AM',
'Thu': '12:30 AM-1:30 AM',
'Tue': '12:15 AM-1:15 AM',
'Fri': '12:30 AM-1:00 AM',
'Sat': '12:00 AM-12:30 AM'
};
const dayAbbreviationToValue = {
'Mon': DateTime.monday,
'Tue': DateTime.tuesday,
'Wed': DateTime.wednesday,
'Thu': DateTime.thursday,
'Fri': DateTime.friday,
'Sat': DateTime.saturday,
'Sun': DateTime.sunday,
};
void main() {
var sortedMap = SplayTreeMap.of(
onlineVideoAppointment,
(key1, key2) => dayAbbreviationToValue[key1]!
.compareTo(dayAbbreviationToValue[key2]!));
for (var entry in sortedMap.entries) {
print('${entry.key}: ${entry.value}');
}
}