如何用Map优化从字符串列表识别英文数字单词的Dart代码?
用Map简化英文数字单词转阿拉伯数字的实现
你提到的用Map来实现的思路非常合理,能大幅简化代码,彻底摆脱冗长的if-else分支。下面是具体的实现方案:
核心实现代码
class DetectNumber { final collection = <String>['Hello', 'nine', 'world', 'one', 'two']; // 定义英文数字与阿拉伯数字的映射表 final numberMap = const { 'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, }; void res() { // 通过集合操作链式处理,一步完成筛选与转换 final resNumbList = collection .map((word) => numberMap[word]) // 用Map快速查找对应数字,非数字单词返回null .where((number) => number != null) // 过滤无效项 .cast<int>() // 将可空类型转为非空int .toList(); print(resNumbList); // 输出: [9, 1, 2] } }
代码说明
- 映射表定义:
numberMap把所有英文数字单词作为键,对应阿拉伯数字作为值,后续查找直接通过键取值,逻辑清晰且高效。 - 链式集合操作:
map:遍历列表每个元素,通过映射表获取对应数字;where:过滤掉映射表中不存在的单词(即返回null的项);cast<int>:解决map返回的可空类型问题,转为非空整数;toList:将处理后的结果转为目标列表。
可选优化:忽略大小写匹配
如果你的列表中存在大小写不一致的数字单词(比如Nine、ONE),可以在查找时统一转为小写,增强兼容性:
final resNumbList = collection .map((word) => numberMap[word.toLowerCase()]) .where((number) => number != null) .cast<int>() .toList();
这种实现方式的优势很明显:后续要扩展数字范围(比如添加ten、eleven),只需要在numberMap中新增键值对即可,维护成本远低于原来的if-else分支结构。
内容的提问来源于stack exchange,提问作者bahmN
相关产品推荐
相关产品推荐

