Допустим у меня есть одномерный массив
int[] a = {1,2,3,4,5,6,7,8,9}
и мне надо преобразовать его в двумерный массив
int[][] b = {{1,2,3},
{4,5,6},
{7,8,9}}
Вот для чего мне надо разбивать массив (Для уровня в игре)
Я тупой помогите(
Следует помнить, что привести в такой вид массив можно только тогда, когда из корня длины исходного массива получается целое число.
int[] matrix = {1, 2, 3, 4, 5, 6, 7, 8, 9};
double lengthInReal = Math.sqrt(matrix.length);
if(lengthInReal % 1 != 0) {
throw new IllegalStateException();
}
int doubleMatrixLength = (int) lengthInReal;
int[][] doubleMatrix = new int[doubleMatrixLength][doubleMatrixLength];
for(int f = 0; f < doubleMatrixLength; f++) {
for(int s = 0; s < doubleMatrixLength; s++) {
doubleMatrix[f][s] = matrix[f * doubleMatrixLength + s];
System.out.print(doubleMatrix[f][s] + " ");
}
System.out.println();
}
Вывод:
1 2 3
4 5 6
7 8 9
Если имели ввиду то, что вы изначально сами должны задавать и размер ряда, и кол-во рядов, то имеет место следующее решение:
final int rowLength = 3;
final int collumnLength = 5;
int[] matrix = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int doubleMatrixYLength = (int) Math.ceil((double) matrix.length / rowLength);
int[][] doubleMatrix = new int[collumnLength][rowLength];
if(doubleMatrixYLength > collumnLength) {
for(int f = 0; f < collumnLength; f++) {
for(int s = 0; s < rowLength; s++) {
doubleMatrix[f][s] = matrix[f * collumnLength + s];
}
}
} else{
for(int f = 0; f < doubleMatrixYLength - 1; f++) {
for(int s = 0; s < rowLength; s++) {
doubleMatrix[f][s] = matrix[f * (doubleMatrixYLength - 1) + s];
}
}
int residueCount = matrix.length % rowLength;
for(int s = 0; s < residueCount; s++) {
doubleMatrix[doubleMatrixYLength - 1][s] = matrix[(doubleMatrixYLength - 1) * (doubleMatrixYLength - 1) + s];
}
}
Тест:
for(int f = 0; f < collumnLength; f++) {
for(int s = 0; s < rowLength; s++) {
System.out.print(doubleMatrix[f][s] + " ");
}
System.out.println();
}
Вывод:
1 2 3
4 5 6
7 8 9
10 0 0
0 0 0
Я решил следующим образом.
Если поменять lengthX
или lengthY
то код все еще
будет работать даже если он выйдет за размер массива.
int lengthX = 5;
int lengthY = 6;
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
int[][] doubleArray = new int[lengthX][lengthY];
int n = 0;
for(int i = 0; i < lengthX; i++) {
for(int j = 0; j < lengthY; j++) {
try {
doubleArray[i][j] = array[n];
} catch(ArrayIndexOutOfBoundsException aioobe) {
// System.out.println(aioobe);
doubleArray[i][j] = 0;
}
n++;
}
}
System.out.println(Arrays.deepToString(doubleArray));
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Мне нужно блокировать кнопки после нажатия любой из них на 5 секундКак я могу это сделать? Именно на 5 вроде через Thread
Начал изучать php и столкнулся с проблемойВот я хочу чтобы к моей странице можно было подключить любое количество плагинов
Устанавливаю yii2Мне необходимо сделать так чтобы по ссылке "site