如何在二维数组中检测相邻重复元素并实现布尔验证方法
二维数组每行连续重复元素检测方案
需求回顾
需要实现一个可复用的布尔方法,检测二维数组的每一行是否存在至少一对连续相邻的重复元素:
- 存在连续重复则对该行输出
yes,否则输出no - 仅判断连续相邻的重复,非连续重复(如第一行的两个23)不触发
yes
测试数据示例:
int[][] testArray = { {23, 14, 42, 34, 23}, // 非连续重复 → no {35, 35, 42, 28, 38}, // 连续重复 → yes {35, 34, 45, 46, 47}, // 无重复 → no {40, 43, 35, 50, 49}, // 无重复 → no {21, 33, 10, 51, 51} // 连续重复 → yes };
现有代码的核心问题
你尝试的几个方法都存在关键错误:
- 索引越界:误用
array.length(二维数组的行数)代替element.length(当前行的元素数),循环边界超出当前行的元素范围;或直接访问i+1却未限制循环上限 - 逻辑错误:
fourthValidation中错误比较数组引用array[i]==array[i+1],而非数组元素validation中i变量作用域错误,外层循环只执行一次就把i累加到最大值- 不必要的三重循环,完全冗余且降低效率
- 输出逻辑缺失:部分方法仅记录值却未按要求输出
yes/no
正确实现方案
1. 单一行的连续重复检测方法
先实现一个独立的布尔方法,专注检测单行是否存在连续重复,逻辑清晰且可复用:
// 检测单行是否存在连续相邻的重复元素 public static boolean hasConsecutiveDuplicates(int[] row) { // 行元素少于2个时不可能有连续重复 if (row == null || row.length < 2) { return false; } // 从第2个元素开始,和前一个元素比较 for (int i = 1; i < row.length; i++) { if (row[i] == row[i-1]) { return true; // 找到连续重复,立即返回true } } return false; // 遍历完无连续重复 }
2. 二维数组遍历与输出方法
调用上面的方法,遍历二维数组的每一行,按要求输出结果:
// 遍历二维数组,对每行输出yes/no public static void checkRowsForConsecutiveDuplicates(int[][] array) { if (array == null || array.length == 0) { return; } for (int[] row : array) { if (hasConsecutiveDuplicates(row)) { System.out.println("yes"); } else { System.out.println("no"); } } }
3. 测试调用
public static void main(String[] args) { int[][] testArray = { {23, 14, 42, 34, 23}, {35, 35, 42, 28, 38}, {35, 34, 45, 46, 47}, {40, 43, 35, 50, 49}, {21, 33, 10, 51, 51} }; checkRowsForConsecutiveDuplicates(testArray); }
输出结果:
no yes no no yes
关键细节说明
- 提前判断边界情况:行为空、元素数不足2时直接返回
false,避免索引越界 - 短路求值:找到连续重复后立即返回,无需遍历整行,提升效率
- 职责分离:单行检测和数组遍历分开,代码更易维护和复用
内容的提问来源于stack exchange,提问作者Skyhigh
相关产品推荐
相关产品推荐

