Pine Script两数组对比删公共值后拼接 循环索引越界问题求解
问题原因
- 数组引用传递错误:直接使用
c = e、d = f赋值时,Pine Script中数组为引用类型,c和e会指向同一块内存地址,修改c时原输入数组e也会被同步修改,且你没有拷贝数组,后续删除操作直接改变了数组实际长度。 - 循环边界固定:for循环的终止值
array.size(e)-1是循环开始前就计算完成的固定值,不会跟随数组删除元素后的长度动态更新,当数组实际长度缩小后,i的取值会超过当前数组的最大索引,触发越界报错。 - 删除索引逻辑错误:匹配到
array.get(e,i) == array.get(f,j)时,错误删除d数组的i位置元素,应该删除d数组的j位置元素;且正序遍历中删除元素后,后续元素的索引会整体前移1位,会跳过下一个元素的比对,也容易触发越界。
可行实现方案
我们采用反向遍历索引的方案避免删除元素导致的索引错乱,同时先拷贝原数组避免修改原始输入:
//@version=4 study("array.concat 去重拼接") a = array.new_float(0) b = array.new_float(0) array.push(a, 0) array.push(a, 1) array.push(a, 2) array.push(a, 4) array.push(b, 0) array.push(b, 1) array.push(b, 3) array.push(b, 4) disjoint(e,f)=> // 先拷贝输入数组,避免修改原数组 c = array.new_float(0) array.concat(c, e) d = array.new_float(0) array.concat(d, f) // 反向遍历c的索引,从最后一位到第一位,删除元素不影响未遍历的索引 for i = array.size(c) - 1 down to 0 val_c = array.get(c, i) // 反向遍历d的索引 for j = array.size(d) - 1 down to 0 val_d = array.get(d, j) if val_c == val_d array.remove(c, i) array.remove(d, j) break // 匹配到后退出内层循环,避免重复删除 // 拼接处理后的两个数组 res = array.new_float(0) array.concat(res, c) array.concat(res, d) res z = disjoint(a,b) if barstate.islast l1 = label.new(bar_index, 0, "AFTER\na: " + tostring(a) + "\nb: " + tostring(b) + "\nZ: " + tostring(z), style = label.style_label_up, size = size.normal) label.delete(l1[1])
运行结果
测试用例下输出结果:
- 原数组a:
[0,1,2,4],原数组b:[0,1,3,4] - 处理后拼接的z:
[2,3],符合预期要求。
内容的提问来源于stack exchange,提问作者MVP_Script
相关产品推荐
相关产品推荐

