Dart列表匹配需求实现及RangeError(index)错误修复
Dart列表处理错误修复与需求实现
问题背景
现有两个列表list1和list2,需求是生成list3:
- list3首先包含list1的全部元素
- 把list2中没在list1的num字段出现过的元素,以
{"num": 对应值, "name": "z"}的格式追加到list3末尾
原运行代码抛出RangeError (index): Index out of range: index should be less than 7: 7错误,且代码逻辑完全不符合需求。
错误原因
- 循环越界:原代码for循环条件写的是
i <= list2.length,list2长度为7,合法索引是0到6,当i=7时访问list2[i]必然触发索引越界,正确条件应为i < list2.length - 逻辑偏离需求:原代码会重复添加list1中匹配list2的元素,且无论是否匹配都追加带"Z"的元素,完全不符合“先保留list1全部元素,再追加list2中未匹配项”的要求
正确代码实现
先提取list1中所有num值存入集合(提升查询效率),再按需求构建list3:
void main() { List list1 = [ {"num": 1, "name": "a"}, {"num": 2, "name": "b"}, {"num": 2, "name": "b"}, {"num": 3, "name": "c"}, {"num": 3, "name": "c"}, {"num": 4, "name": "d"}, {"num": 5, "name": "e"}, {"num": 6, "name": "f"}, {"num": 6, "name": "f"}, {"num": 7, "name": "g"}, {"num": 8, "name": "h"}, {"num": 9, "name": "i"}, {"num": 10, "name": "j"}, {"num": 10, "name": "j"}, ]; List list2 = [1, 3, 10, 30, 40, 50, 60]; // 步骤1:初始化list3,复制list1所有元素 List list3 = [...list1]; // 步骤2:提取list1中所有num值到集合,用于快速判断是否存在 Set<int> existingNums = list1.map((item) => item["num"] as int).toSet(); // 步骤3:遍历list2,筛选出未匹配的元素并追加到list3 for (int num in list2) { if (!existingNums.contains(num)) { list3.add({"num": num, "name": "z"}); } } print(list3); }
运行结果
输出完全符合预期:
[ {"num": 1, "name": "a"}, {"num": 2, "name": "b"}, {"num": 2, "name": "b"}, {"num": 3, "name": "c"}, {"num": 3, "name": "c"}, {"num": 4, "name": "d"}, {"num": 5, "name": "e"}, {"num": 6, "name": "f"}, {"num": 6, "name": "f"}, {"num": 7, "name": "g"}, {"num": 8, "name": "h"}, {"num": 9, "name": "i"}, {"num": 10, "name": "j"}, {"num": 10, "name": "j"}, {"num": 30, "name": "z"}, {"num": 40, "name": "z"}, {"num": 50, "name": "z"}, {"num": 60, "name": "z"}, ]
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

