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

如何在Dart中对含数字与字符串键的Map按升序排序?

问题:Map键包含数字字符串与英文时的排序问题

现有如下Dart Map:

Map<String, String> Dictionary = {
    '37': 'thirty-four',
    '94': 'ninety',
    '91': 'ninety-one',
    '22': 'twenty-one',
    '61': 'sixty-one',
    '9': 'nine',
    '3': 'three',
    '8': 'eight',
    '80': 'eighty',
    '81': 'eighty-one',
    'Ninety-eight': '98',
    'nine-hundred': '900'
};

预期按升序排序后的结果:

3: three
8: eight
9: nine
22: twenty-two
37: thirty-seven
61: sixty-one
80: eighty
81: eighty-one
91: ninety-one
94: ninety four
Ninety-eight: 98
nine-hundred: 900

但使用以下代码排序后,得到的是字符串字典序结果,不符合预期:

sortDict(){
    var sortedByKeyMap = Map.fromEntries(
        Dictionary.entries.toList()..sort((e1, e2) => (e1.key).compareTo((e2.key))));
    print(sortedByKeyMap);
}

实际输出结果:

22: twenty-two
3: three
37: thirty-seven
61: sixty-one
8: eight
80: eighty
81: eighty-one
9: nine
91: ninety-one
94: ninety-four
Ninety-eight: 98
nine-hundred: 900

需要实现:将数字类型的字符串键转换为int类型后再排序,非数字键放在数字键之后。


解决方案

修改排序逻辑,在sort的比较函数中,先尝试将键转换为整数,根据转换结果分规则处理:

sortDict() {
  var sortedEntries = Dictionary.entries.toList()
    ..sort((e1, e2) {
      // 尝试将键转为整数,无法转换时返回null
      int? num1 = int.tryParse(e1.key);
      int? num2 = int.tryParse(e2.key);
      
      if (num1 != null && num2 != null) {
        // 两个都是数字字符串,按整数大小升序比较
        return num1.compareTo(num2);
      } else if (num1 != null) {
        // e1是数字、e2不是,数字键排前面
        return -1;
      } else if (num2 != null) {
        // e2是数字、e1不是,e2排前面
        return 1;
      } else {
        // 两个都不是数字,按字符串字典序比较
        return e1.key.compareTo(e2.key);
      }
    });
  
  var sortedByKeyMap = Map.fromEntries(sortedEntries);
  // 按预期格式打印结果
  sortedByKeyMap.forEach((key, value) {
    print('$key: $value');
  });
}

代码说明

  • int.tryParse()用于判断键是否为纯数字字符串,避免转换失败抛出异常
  • 分三种场景处理比较逻辑,确保数字键按数值升序排列,非数字键统一排在数字键之后,非数字键之间仍保留字典序
  • 遍历打印的方式可以直接输出和预期一致的格式

内容的提问来源于stack exchange,提问作者Black Eyed Beans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:30:41