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

如何更新Flutter/Dart中Map的键?排序后键未按数字顺序

解决Map排序后键重新编号的问题

首先纠正你原代码里的一个错误:排序逻辑中用了myMap[a]['time'],但你的Map里存储时间的键是date,这会导致排序失败,先把这个地方改成myMap[a]['date']。

要更新排序后Map的键,让它们从0开始按数字顺序排列,你可以按以下步骤操作:

方法一:生成新的连续键Map(最简单直接)

先把原Map的所有值按date排序,再遍历排序后的列表,生成键从0开始递增的新Map:

Map<dynamic, dynamic> myMap = {
    0: {"id": 754, "name": "luke", "date": 1665537500000},
    1: {"id": 436, "name": "obi", "date": 1665532400000},
    2: {"id": 866, "name": "vader", "date": 1665532500000},
};

// 1. 将Map的值提取为列表并按date排序
var sortedValues = myMap.values.toList()
  ..sort((a, b) => a['date'].compareTo(b['date']));

// 2. 生成键从0开始的新Map
var myMapSorted = {
  for (int i = 0; i < sortedValues.length; i++) i: sortedValues[i]
};

print(myMapSorted);

执行后输出的Map会是:

{
  0: {"id": 436, "name": "obi", "date": 1665532400000},
  1: {"id": 866, "name": "vader", "date": 1665532500000},
  2: {"id": 754, "name": "luke", "date": 1665537500000}
}

方法二:用SplayTreeMap保持有序结构

如果需要保留SplayTreeMap的有序特性,可以基于排序后的列表重新构建:

var sortedValues = myMap.values.toList()
  ..sort((a, b) => a['date'].compareTo(b['date']));

var myMapSorted = SplayTreeMap<int, dynamic>();
for (int i = 0; i < sortedValues.length; i++) {
  myMapSorted[i] = sortedValues[i];
}

这样得到的myMapSorted不仅按date排序,键也会是连续的0、1、2...


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:01:10