Поверните массив по часовой стрелке

У меня есть двумерная матрица, что я должен повернуть 90 градусов по часовой стрелке, однако я продолжаю получать arrayindexoutofbounds...

public int[][] rorateArray(int[][] arr){

        //first change the dimensions vertical length for horizontal length
        //and viceversa
        int[][] newArray = new int[arr[0].length][arr.length];

        //invert values 90 degrees clockwise by starting from button of
        //array to top and from left to right
        int ii = 0;
        int jj = 0;
        for(int i=0; i<arr[0].length; i++){
            for(int j=arr.length-1; j>=0; j--){
                newArray[ii][jj] = arr[i][j];

                jj++;
            }
            ii++;
        }

        return newArray;
    }
10
задан user69514 10 May 2010 в 00:53
поделиться

3 ответа

Я не понимаю логику ваших циклов - разве это не должно быть

   for(int i=0; i<arr[0].length; i++){
        for(int j=arr.length-1; j>=0; j--){
            newArray[i][j] = arr[j][i];
        }
    }

Чистая от того, растет ли каждый индекс, например i здесь, или вниз, например j здесь (и о том, нужно ли одно или оба «перевернуть» в назначении, например, используя arr.length-1-j вместо обычного j на одной стороне = в назначении ;-), поскольку размеры arr равны arr.length от arr [0] .length , и наоборот для newArray , мне кажется, что первый индекс на arr (второй на newArray ) должен охватывать диапазон от 0 до arr.length-1 включительно, а другой диапазон - для другого индекса.

Это своего рода «базовый размерный анализ» (за исключением того, что «размерность» используется в другом смысле, чем обычно используется с «размерным анализом», который относится к физическим размерам, то есть времени, массе, длине и т. Д .; ). Проблема «переворачивания» и того, что каждый цикл идет вверх или вниз, зависит от того, точно визуализирую, что вы имеете в виду, и я не лучший «мысленный визуализатор», поэтому я думаю, что в реальной жизни я бы попробовал различные варианты этого » транспонирование оси ", пока я не выберу то, что имелось в виду ;-).

14
ответ дан 3 December 2019 в 13:20
поделиться

jj++ выполняется i*j раз, и это не может быть хорошо.

Попробуйте сбросить jj во внешнем цикле.

3
ответ дан 3 December 2019 в 13:20
поделиться

Вот стандартный код поворота матрицы по часовой стрелке:

static int[][] rotateCW(int[][] mat) {
    final int M = mat.length;
    final int N = mat[0].length;
    int[][] ret = new int[N][M];
    for (int r = 0; r < M; r++) {
        for (int c = 0; c < N; c++) {
            ret[c][M-1-r] = mat[r][c];
        }
    }
    return ret;
}

Обратите внимание на несколько вещей:

  • Улучшает читабельность обращение к размерности матрицы MxN как M и N
  • Традиционно использовать r, c вместо i, j для индексации строки и столбца матрицы
  • Это не самая надежная реализация:
    • Не гарантирует, что mat является действительной MxN матрицей, M>0, N>0
  • Используйте явную формулу отображения вместо посторонних локальных переменных.
    • Делает программу менее сложной и более читабельной

Вот тестовый пакет:

import java.util.Arrays;
//...

static void printMatrix(int[][] mat) {
    System.out.println("Matrix = ");
    for (int[] row : mat) {
        System.out.println(Arrays.toString(row));
    }
}
public static void main(String[] args){
    int[][] mat = {
        { 1, 2, 3 },
        { 4, 5, 6 }
    };
    printMatrix(mat);
    // Matrix = 
    // [1, 2, 3]
    // [4, 5, 6]

    int[][] matCW = rotateCW(mat);
    printMatrix(matCW);
    // Matrix = 
    // [4, 1]
    // [5, 2]
    // [6, 3]
}

Обратите внимание на использование цикла for-each и java.util.Arrays в printMatrix. Вам обязательно следует ознакомиться с ними, если вы часто работаете с массивами в Java.

Ссылки на матричные библиотеки Java

Если вы часто работаете с матрицами, возможно, вам стоит рассмотреть возможность использования специализированной матричной библиотеки.

Похожие вопросы

Технически, в Java есть массивы массивов. Убедитесь, что вы понимаете все последствия.

37
ответ дан 3 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: