Цикл по 2d массиву

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;
    }
}
Теги:

1 ответ

2
Лучший ответ

Вам нужно тщательно подумать, какая переменная указывает на строку, а какая - на столбец. И в каком массиве (a или good).

Когда я включил их в свой код, эта улучшенная версия работает:

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] Помните, что i был строкой в a, а не в good. В good это столбец. Поэтому вам нужно поменять свои я и k по обе стороны задания.
  • 0
    Спасибо !, очень полезно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню