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

Kotlin中高效检查两个IntArray元素差值不超1的最优方法

Kotlin中检查两IntArray元素差值不超过1的高效实现

原代码的问题

  1. 条件逻辑错误:原代码中pixels1[i] - pixels2[i] > 1 && pixels1[i] - pixels2[i] < -1的判断永远不成立,一个数不可能同时大于1且小于-1,应改用||或直接判断绝对值大于1。
  2. 循环范围错误:0 until pixels1.lastIndex会漏掉最后一个元素,正确范围应为pixels1.indices(等价于0..pixels1.lastIndex)。
  3. 无提前终止:找到不符合条件的元素后未立刻停止循环,会产生不必要的遍历开销。
  4. 未处理数组长度不一致:若两个数组长度不同,直接遍历会导致索引越界,逻辑上也应判定为不符合要求。

优化实现方案

方案一:高效原生循环(性能最优)

原生循环处理大数组时性能最佳,避免了集合操作的额外开销,同时加入提前终止和长度检查:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:25:16