You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dart中对Map<String,Map<String,String>>按messageTime降序排序

在Dart中对嵌套Map按messageTime降序排序

Dart的普通Map本身是无序的,要实现按messageTime降序排列,需要先将Map的条目转为列表排序,再转回有序的LinkedHashMap来保留顺序,具体步骤如下:

实现代码

import 'dart:collection'; // 导入包以使用LinkedHashMap

void main() {
  // 原始数据集合
  Map<String, Map<String, String>> messages = {
    "33": {
      "id": "25766f01628f3d34b93a36a2301dffc9",
      "messageTime": "2023-07-02 20:42:09.994688",
      "messageContent": "Hi Hello",
      "read": "false"
    },
    "35": {
      "id": "b6617980ce90f637e68c3ebe8b9be745",
      "messageTime": "2023-07-10 20:42:09.994688",
      "messageContent": "Hi Hello How are you ?",
      "read": "false"
    }
  };

  // 1. 将Map条目转为列表并按messageTime降序排序
  var sortedEntries = messages.entries.toList()
    ..sort((entryA, entryB) {
      // 解析字符串时间为DateTime,保证时间比较的准确性
      final timeA = DateTime.parse(entryA.value['messageTime']!);
      final timeB = DateTime.parse(entryB.value['messageTime']!);
      // 降序逻辑:较新的时间排在前面
      return timeB.compareTo(timeA);
    });

  // 2. 转换为LinkedHashMap,保留排序后的顺序
  final sortedMessages = LinkedHashMap.fromEntries(sortedEntries);

  // 验证排序结果
  sortedMessages.forEach((key, value) {
    print('Key: $key | 时间: ${value['messageTime']} | 内容: ${value['messageContent']}');
  });
}

关键说明

  • LinkedHashMap的作用:普通Map不维护插入顺序,排序后转成LinkedHashMap能确保后续遍历、使用时保持排序后的顺序。
  • 时间解析的必要性:虽然你的messageTime是ISO兼容格式的字符串,直接比较字符串也能生效,但解析为DateTime类型更严谨,可应对后续可能的格式调整(如时区变化)。
  • 排序逻辑调整:如果需要升序排序,只需将timeB.compareTo(timeA)替换为timeA.compareTo(timeB)即可。

内容的提问来源于stack exchange,提问作者Sumit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:10:31