Kotlin中高效检查两个IntArray元素差值不超1的最优方法
Kotlin中检查两IntArray元素差值不超过1的高效实现
原代码的问题
- 条件逻辑错误:原代码中
pixels1[i] - pixels2[i] > 1 && pixels1[i] - pixels2[i] < -1的判断永远不成立,一个数不可能同时大于1且小于-1,应改用||或直接判断绝对值大于1。 - 循环范围错误:
0 until pixels1.lastIndex会漏掉最后一个元素,正确范围应为pixels1.indices(等价于0..pixels1.lastIndex)。 - 无提前终止:找到不符合条件的元素后未立刻停止循环,会产生不必要的遍历开销。
- 未处理数组长度不一致:若两个数组长度不同,直接遍历会导致索引越界,逻辑上也应判定为不符合要求。
优化实现方案
方案一:高效原生循环(性能最优)
原生循环处理大数组时性能最佳,避免了集合操作的额外开销,同时加入提前终止和长度检查:
val PIXEL_VALUE_TOLERANCE = 1 var pixelOutsideOfTolerance = false if (pixels1.size == pixels2.size) { for (i in pixels1.indices) { val diff = pixels1[i] - pixels2[i] // 检查差值是否超出容忍范围 if (diff > PIXEL_VALUE_TOLERANCE || diff < -PIXEL_VALUE_TOLERANCE) { pixelOutsideOfTolerance = true break // 找到不符合项立刻终止循环 } } } else { // 数组长度不一致直接判定为不符合 pixelOutsideOfTolerance = true } // 后续处理逻辑
方案二:优雅的Kotlin集合操作(可读性优先)
利用Kotlin标准库的zip和any函数,代码更简洁,且any会在找到第一个不符合项时停止遍历,效率接近原生循环:
val PIXEL_VALUE_TOLERANCE = 1 val pixelOutsideOfTolerance = when { pixels1.size != pixels2.size -> true else -> pixels1.zip(pixels2).any { (a, b) -> kotlin.math.abs(a - b) > PIXEL_VALUE_TOLERANCE } } // 后续处理逻辑
关键说明
- 优先处理数组长度不一致的情况,避免索引越界;
- 无论采用哪种方式,找到不符合项后立刻终止遍历是提升性能的核心;
- 使用
kotlin.math.abs可简化差值范围判断,让代码更易读。
内容的提问来源于stack exchange,提问作者Crocodile
相关产品推荐
相关产品推荐

