在飞镖中按工作日对地图进行排序

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.mondayDateTime.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}');
  }
}