2014-03-29 139 views
1

我对这段代码有困难。我试图返回一个2d,这是输入数组的反转。 我不知道如何正确编码。也许有人可能会有几点建议通过二维数组循环

public class arrays { 
    int[][] transpose(int[][] a) { 
     int[][] good = new int[a.length][a.length]; /* assign dimension, I want it to be the same as input */ 

     for (int i = 0; i < a.length; i++) { 
      for (int k = 0; k < a[k].length; k++) { // //nested loop to go through the rows and columns 
       good[i][k] = a[k][i]; // /// switch elements 
      } 
     } 
     return good; 
    } 
} 

回答

2

你需要仔细考虑哪个变量表示一行,哪一列是一列。并在哪个数组中(agood)。

正如我在你的代码周围切换这些,这个改进版做的工作:

public class Arrays { 
    static int[][] transpose(int[][] a) { 
     // Only works if a is rectangular (every row in a has the same number of columns) 
     int[][] good = new int[a[0].length][a.length]; 

     for (int i = 0; i < a.length; i++) { 
      // Use a[i].length, not a[k].length because k will be bigger than a.length at some point. 
      for (int k = 0; k < a[i].length; k++) { 
       // i = row in 'a', column in 'good' 
       // k = column in 'a', row in 'good' 
       good[k][i] = a[i][k]; 
      } 
     } 
     return good; 
    } 
} 

的问题是:

  1. int[][] good = new int[a.length][a.length];在这里,你正在创建good即使原始方阵可以是任何矩形形状(不同数量的行和列)。您需要切换行数和列数,因此new int[a[0].length][a.length]是一个很好的解决方案。 (假设所有行具有相同的列数,这是在一个矩阵需要)
  2. for (int k = 0; k < a[k].length; k++)这里k将会增加,直到它比a.length大,你会得到一个ArrayIndexOutOfBoundsException要循环对所有列行i,所以上限为a[i].length,而不是a[k]
  3. good[i][k] = a[k][i]请记住,ia中的行,而不是good。在good,它是专栏。所以你需要在作业的两边交换你的i和k。
+0

谢谢!非常有帮助 – tim