2017-03-17 80 views
0
public static int [][] reverseRows (int [][] matrix) { 
    int i, j, k = (matrix.length - 1), l = (matrix[0].length - 1); 
    int [][] rr = new int[matrix.length][matrix[0].length]; 

    for(i = 0; i < matrix.length; i++) { 
     for(j = 0; j < matrix[i].length; j++) 
      rr[k][l--] = matrix[i][j]; // <--- This line 
     k--; 
    } 
    printMatrix(rr); 
    return matrix; 
} 

我想颠倒作为参数传递的矩阵中的行,并且我想出了这个装置。它适用于一个1x1矩阵,出于显而易见的原因,但不是为别人,我收到此错误:索引行矩阵的行反转的边界

java.lang.ArrayIndexOutOfBoundsException: -1

在由注释指示线。所以我的l迭代器显然被索引太远,过去0(如果我的眼睛不欺骗我,为-1)。 l重复次数与j相同吗?由于它们的尺寸相同,为什么j不能在matrix的末尾读取,但l正在读取的是rr

+0

感谢您使我们这些编辑:) – DanBan

+0

没问题,运气好得到援助。 – csmckelvey

回答

0

你的代码将正常工作的一个迭代

for(i = 0; i < matrix.length; i++) { 
     for(j = 0; j < matrix[i].length; j++) 
      rr[k][l--] = matrix[i][j]; // <--- This line 
     k--; 
    } 

您必须分配再次l = matrix[0].length-1升为下一次迭代

for(i = 0; i < matrix.length; i++) { 
     l = matrix[0].length - 1; // <--- This line 
     for(j = 0; j < matrix[i].length; j++) 
      rr[k][l--] = matrix[i][j]; 
     k--; 
    } 

希望这有助于。

+0

对。因为它会在下一个循环开始时为0。谢谢你的帮助:) – DanBan

+0

很高兴它帮助你:) – Sanjeev

0

我觉得你需要在每个j循环之后重新分配'l'的值,就像你的代码一样,变量'l'是递减的i * j倍。 试着这么做:

public static int [][] reverseRows (int [][] matrix) { 
    int i, j, k = (matrix.length - 1), l = (matrix[0].length - 1); 
    int [][] rr = new int[matrix.length][matrix[0].length]; 

    for(i = 0; i < matrix.length; i++) { 
     l = (matrix[0].length - 1); 
     for(j = 0; j < matrix[i].length; j++) 
      rr[k][l--] = matrix[i][j]; // <--- This line 
     k--; 
    } 
    printMatrix(rr); 
    return matrix; 
}