如何正确遍历二维数组实现elementIsUsed元素相等判断及报错解决
二维数组遍历实现相等判断的正确方案
原代码的核心问题
- 循环逻辑完全无效:仅遍历二维数组的外层长度(即总行数),循环体全程没有使用循环变量做遍历操作,每次都固定对比
curYPos/curXPos和nextYPos/nextXPos两个固定坐标的元素,完全没有完成全数组遍历的目标 - 逻辑边界混淆:
elementIsUsed方法本身的规则是判断两个坐标是否相等,属于纯参数对比逻辑,原实现错误把遍历逻辑嵌入到固定坐标判断的代码块中,导致大数组遍历空转
相邻元素相等判断的正确实现
针对“遍历数组,若下一个整数与当前整数相等则返回True”的需求,需要同时遍历二维数组的行维度和列维度,且匹配到符合条件的元素后直接终止遍历,降低大数组场景下的运行开销:
boolean hasAdjacentEqualElement(int[][] array) { // 空数组直接返回,避免索引越界 if (array == null || array.length == 0) return false; for (int y = 0; y < array.length; y++) { int[] currentRow = array[y]; // 对比当前行内相邻的左右元素 for (int x = 1; x < currentRow.length; x++) { if (currentRow[x] == currentRow[x - 1]) { return true; } } // 对比相邻行的上下元素(如需跨行判断) if (y > 0) { for (int x = 0; x < currentRow.length; x++) { if (currentRow[x] == array[y - 1][x]) { return true; } } } } return false; }
elementIsUsed方法的正确实现
按照给定规则,当curYPos与nextYPos相等、且curXPos与nextXPos相等时返回true,该逻辑不需要遍历数组,属于O(1)时间复杂度的参数对比,完全适配大规模数组的使用场景:
boolean elementIsUsed(int curYPos, int curXPos, int nextYPos, int nextXPos) { return curYPos == nextYPos && curXPos == nextXPos; }
如果实际场景是需要判断两个坐标指向的元素值相等,而非坐标本身相等,也无需全量遍历数组,直接通过坐标访问对应元素对比即可,注意补充边界校验避免索引越界:
boolean elementIsUsed(int[][] array, int curYPos, int curXPos, int nextYPos, int nextXPos) { // 边界校验 if (curYPos < 0 || curYPos >= array.length || nextYPos < 0 || nextYPos >= array.length || curXPos < 0 || curXPos >= array[curYPos].length || nextXPos < 0 || nextXPos >= array[nextYPos].length) { return false; } return array[curYPos][curXPos] == array[nextYPos][nextXPos]; }
原代码常见报错原因
- 循环变量
index未被实际使用,在启用严格语法检查的环境下会触发未使用变量的编译错误 - 固定坐标访问数组时,坐标值超出数组的行/列边界,触发数组索引越界的运行时错误
- 大规模数组遍历未做提前终止处理,全量遍历所有元素导致运行超时,被误判为代码运行报错
内容的提问来源于stack exchange,提问作者ItsDanielle
相关产品推荐
相关产品推荐

