У меня есть двумерная матрица, что я должен повернуть 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;
}
Я не понимаю логику ваших циклов - разве это не должно быть
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
включительно, а другой диапазон - для другого индекса.
Это своего рода «базовый размерный анализ» (за исключением того, что «размерность» используется в другом смысле, чем обычно используется с «размерным анализом», который относится к физическим размерам, то есть времени, массе, длине и т. Д .; ). Проблема «переворачивания» и того, что каждый цикл идет вверх или вниз, зависит от того, точно визуализирую, что вы имеете в виду, и я не лучший «мысленный визуализатор», поэтому я думаю, что в реальной жизни я бы попробовал различные варианты этого » транспонирование оси ", пока я не выберу то, что имелось в виду ;-).
jj++ выполняется i*j раз, и это не может быть хорошо.
Попробуйте сбросить jj во внешнем цикле.
Вот стандартный код поворота матрицы по часовой стрелке:
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;
}
Обратите внимание на несколько вещей:
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 есть массивы массивов. Убедитесь, что вы понимаете все последствия.