Как преобразовать одномерный массив в дву-мерный

94
15 марта 2022, 02:50

Допустим у меня есть одномерный массив

int[] a = {1,2,3,4,5,6,7,8,9}

и мне надо преобразовать его в двумерный массив

int[][] b = {{1,2,3},
             {4,5,6},
             {7,8,9}}

Вот для чего мне надо разбивать массив (Для уровня в игре)

Я тупой помогите(

Answer 1

Следует помнить, что привести в такой вид массив можно только тогда, когда из корня длины исходного массива получается целое число.

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

Answer 2

Я решил следующим образом.

Если поменять 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));
READ ALSO
Как заблокировать все кнопки при нажатии одной из них?

Как заблокировать все кнопки при нажатии одной из них?

Мне нужно блокировать кнопки после нажатия любой из них на 5 секундКак я могу это сделать? Именно на 5 вроде через Thread

94
реализация работы плагинов на php

реализация работы плагинов на php

Начал изучать php и столкнулся с проблемойВот я хочу чтобы к моей странице можно было подключить любое количество плагинов

69
Установка yii2. Избавиться от frontend/web/ и backend/web/ в url-е

Установка yii2. Избавиться от frontend/web/ и backend/web/ в url-е

Устанавливаю yii2Мне необходимо сделать так чтобы по ссылке "site

68