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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:57:02