如何移除数组中存在于另一数组的值及解决数组越界错误
问题分析与解决方案
错误原因
报错'array.get()'函数中,索引46超出范围,数组大小为45的核心原因是正向循环删除数组元素时,数组长度动态缩短导致索引越界:
- 在
for i = 0 to ...的正向循环中调用numbersWHOLE.remove(i)时,数组长度会立即减1,后续元素向前移位。 - 循环仍按初始数组长度递增i,当i超过删除元素后的数组最大索引时,就会触发索引越界错误。
修复方案
更高效且安全的方式是直接构建新数组,只保留不在目标排除数组中的元素,避免循环删除的索引错乱问题,同时完成「从numbersWHOLE/numbersHALF中移除存在于numbersBIG/numbersBIGhalf的值」的需求:
完整修复代码
//@version=5 indicator("snippet", overlay=true, max_lines_count = 500, max_bars_back = 500) TRange = 1.2700 BRange = 1.2205 ArrFreq = 100*syminfo.mintick BRange00 = 1.2200 bigArrFreq = 1000*syminfo.mintick BRangeBigHALF = 1.2250 var numbersWHOLE=array.new_float(0) var numbersHALF=array.new_float(0) var numbersBIG=array.new_float(0) var numbersBIGhalf=array.new_float(0) if barstate.islast and timeframe.isintraday // 重置数组,避免重复累加元素 array.clear(numbersBIG) array.clear(numbersBIGhalf) array.clear(numbersHALF) array.clear(numbersWHOLE) // 填充基础数组 for i = BRange00 to TRange by bigArrFreq array.push(numbersBIG,i) for i = BRangeBigHALF to TRange by bigArrFreq array.push(numbersBIGhalf,i) for i = BRange to TRange by ArrFreq array.push(numbersHALF,i) for i = BRange00 to TRange by ArrFreq array.push(numbersWHOLE,i) // 筛选numbersWHOLE:移除存在于numbersBIG的元素 var tempWHOLE = array.new_float(0) array.clear(tempWHOLE) for val in numbersWHOLE if not numbersBIG.includes(val) array.push(tempWHOLE, val) array.clear(numbersWHOLE) array.push(numbersWHOLE, tempWHOLE) // 筛选numbersHALF:移除存在于numbersBIGhalf的元素 var tempHALF = array.new_float(0) array.clear(tempHALF) for val in numbersHALF if not numbersBIGhalf.includes(val) array.push(tempHALF, val) array.clear(numbersHALF) array.push(numbersHALF, tempHALF) // 绘制线条逻辑保持不变 for i = 0 to array.size(numbersHALF) - 1 line.new(bar_index - 20, array.get(numbersHALF,i),bar_index + 20, array.get(numbersHALF,i), style = line.style_dashed, color = color.red, width = 1) for i = 0 to array.size(numbersWHOLE) - 1 line.new(bar_index - 20, array.get(numbersWHOLE,i),bar_index + 20, array.get(numbersWHOLE,i), style = line.style_dashed, color = color.red, width = 1) for i = 0 to array.size(numbersBIGhalf) - 1 line.new(bar_index - 400, array.get(numbersBIGhalf,i),bar_index + 100, array.get(numbersBIGhalf,i), style = line.style_dashed, color = color.white, width = 1, extend = extend.both) for i = 0 to array.size(numbersBIG) - 1 line.new(bar_index - 400, array.get(numbersBIG,i),bar_index + 100, array.get(numbersBIG,i), style = line.style_dashed, color = color.white, width = 1, extend = extend.both)
关键优化点
- 数组重置:每次
barstate.islast触发时清空所有数组,避免多次执行时元素重复累加。 - 筛选式构建新数组:用
for val in ...遍历原数组,将符合条件的元素存入临时数组后替换原数组,彻底规避索引越界问题。 - 明确排除逻辑:分别处理两组数组的排除关系,完全匹配需求。
内容的提问来源于stack exchange,提问作者Vilém Ivanov
相关产品推荐
相关产品推荐

