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
相关产品推荐
相关产品推荐

