Обратный многомерный массив - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь перевернуть многомерный массив, в котором количество столбцов в каждой строке не одинаково.

Прямо сейчас мне удалось перевернуть массив в примере, но что если размер столбцаизменить в каждом ряду?скажем, массив состоит из {{1}, {1,2,3}, {1,2} .......} есть ли более разумный способ сделать это без использования операторов if для каждой строки?

int[][] array3 = new int[3][4];
int[][] array4 = {{1,2,3},{7,8,6},{3,2,1,0}};

int counter = 2;
for(int row=0; row<array4.length; row++)
{
    if(row == 2)
        counter = 3;
    for(int col=0; col<array4[row].length; col++)
    {
        array3[row][counter] = array4[row][col];
        counter--;
    }
    counter = 2;
}

1 Ответ

3 голосов
/ 09 мая 2019

Вы можете использовать два простых цикла for, перебирающих массивы и создающих новый:

int[][] reversed = new int[array.length][];
for (int i = 0; i < array.length; i++) {
    int[] row = array[array.length - i - 1];
    reversed[i] = new int[row.length];
    for (int j = 0; j < row.length; j++) {
        reversed[i][j] = row[row.length - j - 1];
    }
}

С Java Streams вы можете использовать это, что делает то же самое:

int[][] reversed = IntStream.rangeClosed(1, array.length)
        .mapToObj(i -> array[array.length - i])
        .map(row -> IntStream.rangeClosed(1, row.length)
                .map(i -> row[row.length - i])
                .toArray())
        .toArray(int[][]::new);

Для входного массива, который вы показали:

int[][] array = {{1, 2, 3}, {7, 8, 6}, {3, 2, 1, 0}};

Результат с обоими решениями будет таким:

[[0, 1, 2, 3], [6, 8, 7], [3, 2, 1]]
...