循环通过2d数组

时间:2014-03-29 06:56:11

标签: java

我对此代码有困难。我试图返回一个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;
    }
}

1 个答案:

答案 0 :(得分: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您想要遍历行{{中的所有列1}},所以上限是i,而不是a[i].length
  3. a[k]请注意good[i][k] = a[k][i] i 中的行,而不是a中的行。在good中,它是列。所以你需要在作业的两边交换你的i和k。