Dart合并数组报JSInt非bool子类型错误及代码优化咨询
错误根因
- Dart语法不支持JavaScript风格的truthy/falsy隐式类型转换,所有
if/while的条件判断必须显式返回bool类型值。你代码中while (arr2Item || arr1Item)、if (!arr2Item)两处直接把数值/Null值作为布尔值使用,运行时尝试把数值21转为bool类型失败,触发了报错,和返回类型、编辑器无关。 - 存在索引笔误:else分支中给
arr2Item赋值时误用了arr1的指针i,应该用arr2对应的指针j,会导致取值错误甚至下标越界。 - 存在数组越界风险:Dart的List不允许用超过长度的下标直接访问元素,否则会直接抛出范围错误,不能直接通过
arr1[i]的方式尝试获取空值来判断遍历是否结束。
修正后的可运行代码
List<int> mergeSortedArray(List<int> arr1, List<int> arr2) { List<int> list = []; int i = 0, j = 0; if (arr1.isEmpty) return arr2; if (arr2.isEmpty) return arr1; while (i < arr1.length || j < arr2.length) { // 显式判断遍历是否结束、数值大小 if (j >= arr2.length || (i < arr1.length && arr1[i] < arr2[j])) { list.add(arr1[i]); i++; } else { list.add(arr2[j]); j++; } } print(list); return list; } void main() { mergeSortedArray([1, 2, 5, 31], [21, 5, 8]); }
优化实现方案
- 如果你是要合并两个升序有序数组,你原本用的双指针思路时间复杂度为O(m+n)(m、n为两个数组的长度),已经是理论最优的实现方案,没有效率更高的写法,只需要修正语法问题即可。
- 如果不需要保持数组有序,直接用Dart内置的语法即可,实现最简洁且性能经过官方优化:
// 方法1:不修改原数组,返回新的合并数组 List<int> merge(List<int> a, List<int> b) => [...a, ...b]; // 方法2:直接修改第一个数组,合并后返回 List<int> merge(List<int> a, List<int> b) => a..addAll(b);
内容的提问来源于stack exchange,提问作者Hassan Amer
相关产品推荐
相关产品推荐

