为何Java代码中的嵌套循环未执行直接被跳过?
为什么矩阵对称判断的循环会被直接跳过?
我写了一段判断矩阵是否对称的Java代码,但循环被直接跳过,添加的打印语句完全没执行。即使把循环条件改成i - 2和j - 2也没用,最终方法返回了true,但我的矩阵明明不是对称的。
代码片段:
public static void main(String[] args) throws Exception { int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; System.out.println(hasSymmetry(matrix)); // 返回true,说明isComputable条件已满足,否则会返回false。 } public static boolean hasSymmetry(int[][] matrix){ // isComputable在其他地方定义,且工作正常。 if(!isComputable(matrix)){ return false; } int length = matrix.length; // 循环被直接跳过且无报错,我添加了打印语句用于排查,但并未执行。 for (int i = 0; i == length; i++){ System.out.println("Inside loop" + i); for (int j = 0; j == length; j++){ if (matrix[i][j] != matrix[j][i]) { System.out.println(matrix[i][j] + " vs " + matrix[j][i]); return false; } } } return true; }
问题出在for循环的条件判断逻辑上:
for循环的语法是for(初始化; 循环继续条件; 迭代),只有当中间的条件为true时,循环体才会执行。
你的代码里写的是:
for (int i = 0; i == length; i++)
初始i=0,而length=3(因为矩阵是3x3的),0 == 3是false,所以循环直接终止,根本不会进入循环体。内层循环的j == length也是同样的问题。
修正方案
把循环条件改成小于length的判断,这样才能遍历矩阵的每一个元素:
public static boolean hasSymmetry(int[][] matrix){ if(!isComputable(matrix)){ return false; } int length = matrix.length; for (int i = 0; i < length; i++){ System.out.println("Inside loop" + i); for (int j = 0; j < length; j++){ if (matrix[i][j] != matrix[j][i]) { System.out.println(matrix[i][j] + " vs " + matrix[j][i]); return false; } } } return true; }
额外优化
其实判断对称矩阵不需要遍历所有元素,只需要遍历上三角(或下三角)区域即可,避免重复判断,提升效率:
public static boolean hasSymmetry(int[][] matrix){ if(!isComputable(matrix)){ return false; } int length = matrix.length; for (int i = 0; i < length; i++){ // j从i+1开始,只判断对角线以上的元素 for (int j = i + 1; j < length; j++){ if (matrix[i][j] != matrix[j][i]) { System.out.println(matrix[i][j] + " vs " + matrix[j][i]); return false; } } } return true; }
内容的提问来源于stack exchange,提问作者Hopfield
相关产品推荐
相关产品推荐

