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

