hi мой код работает, если массив имеет одинаковую длину для строк и столбцов. но когда они разные, они не работают. как я могу передать длину моему новому массиву?
public class rotatearray {
public static void main(String[] args) {
int[][] a = {{1, 2, 3,4},
{4, 5,6,5},
{7, 8, 9,7}};
rotate(a);
}
public static int[][] rotate(int[][] a) {
int[][] b = new int[a.length][a.length];
for(int i=0; i<a.length; i++){
for(int j=0; j<a[i].length; j++){
b[j][i] = a[a.length-i-1][a.length-j-1];
System.out.print(b[j][j]);
}
}
return b;
}
}
Ваша проблема связана с назначением длины строки и столбца нового массива, основанной только на длине исходного массива. Решение должно принимать оба эти значения и заменять их
Я объявляю переменные для исходной строки и длины столбца. Это облегчает обзор с первого взгляда, что они должны означать.
Вам также нужно будет присвоить массив "a" возвращаемым значением метода rotate, поскольку размер исходного массива не может быть изменен после создания.
import java.util.Arrays;
public class ArrayRotator {
public static void main(String[] args) {
int[][] a = { { 1, 2, 3, 4 }, { 4, 5, 6, 5 }, { 7, 8, 9, 7 } };
// uses rotate method to assign new value to array
a = rotate(a);
}
public static int[][] rotate(int[][] arr) {
// return if supplied array is empty
if (arr.length == 0) {
return new int[0][0];
}
// create new array with swapped length for rows and columns
int origRows = arr.length;
int origCols = arr[0].length;
int[][] rotatedArr = new int[origCols][origRows];
for (int i = 0; i < origRows; i++) {
for (int j = 0; j < origCols; j++) {
// Rotate array 90 degrees clockwise:
// new row <- original column
// new column <- original row, reversed
rotatedArr[j][i] = arr[origRows - 1 - i][j];
}
}
return rotatedArr;
}
}
ANSWER: вы не можете изменять размер массива после его создания.
Чтобы "повернуть" ваш массив, вам придется создать еще один 2D-массив, в котором длина столбца равна длине строк оригинала, а длина строк равна длине столбца оригинала.
Проблема в том, что вы используете длину строк матрицы, чтобы получить размер строк и столбцов. Поэтому он работает только на квадратных матрицах. Попробуйте это, и вы скажете разницу:
int[][] m = new int[3][4];
System.out.println(m.length);
System.out.println(m[0].length);
m[0].length
, оно не обязательно совпадает с m[1].length
и так далее. Часть, которая делает j<a[i].length
является правильным способом считывания длины каждой подмассивы.
Arrays
для создания копий массивов. УБЕДИТЕСЬ, ЧТО ВЫ ПРОЧИТАЛИ API ВНИМАТЕЛЬНО, ЕСЛИ ВЫ ДЕЛАЕТЕ. Кроме того, вы можете использовать цикл, чтобы получить значение из одного места и поместить его во вновь созданный массив.