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

Flutter中如何按key的日期数值对Map进行正确升序排序

问题根源

排序逻辑的核心错误是比较对象是字符串而非数值:

  • 拆分key后拿到的日期片段是String类型,直接调用compareTo默认按ASCII字典序排序
  • 字典序是逐字符对比,因此会出现"1" < "10" < "11" < "2" < "3"的结果,和数字大小的排序逻辑完全不同,这就是顺序错乱的直接原因。
修复方法

把拆分出的日期字符串转成整数,再按数值大小比较即可。Dart默认的LinkedHashMap是按插入顺序存储键值对的,排序后重新塞回原Map就能保留正确顺序。

正确实现代码:

var sortedEntries = allData.entries.toList()
  ..sort((a, b) {
    // 去掉key首尾空格,拆分后取第一段转成整数日期
    int dayA = int.parse(a.key.trim().split('-')[0]);
    int dayB = int.parse(b.key.trim().split('-')[0]);
    // 按数值升序比较
    return dayA.compareTo(dayB);
  });

allData..clear()..addEntries(sortedEntries);

补充说明

你原来写的replaceAll(" ", "")没必要全局替换空格,从示例数据看,key里的空格只存在于首尾,用trim()处理首尾空白就够,效率更高。如果后续存在key格式不合法的可能,可以给int.parse加异常捕获,解析失败时返回默认值,避免运行时崩溃。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:45:29