Нужно написать статическую функцию trans, которая принимает двумерный прямоугольный (по предположению) массив целых чисел

Нужно написать статическую функцию trans, которая принимает двумерный прямоугольный (по предположению) массив целых чисел.

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

import java.util.Arrays;

public class Arrays {
         // ...
    public static void main (String[] args) {
        int[][] a = { 
            {1, 2, 3, 4, 5, 6},
            {2, 3, 4, 5, 6, 7},
            {3, 4, 5, 6, 7, 8},
            {4, 5, 6, 7, 8, 9} 
        };
        for (int[] r : a)
            System.out.println(Arrays.toString(r));
        System.out.println();

        for (int[] r : trans(a))
            System.out.println(Arrays.toString(r));
    }
}

Должно напечатать:

        [1, 2, 3, 4, 5, 6]
        [2, 3, 4, 5, 6, 7]
        [3, 4, 5, 6, 7, 8]
        [4, 5, 6, 7, 8, 9]
        [1, 2, 3, 4]
        [2, 3, 4, 5]
        [3, 4, 5, 6]
        [4, 5, 6, 7]
        [5, 6, 7, 8]
        [6, 7, 8, 9]

Ответы (1 шт):

Автор решения: Alex Rudenko

Для транспонирования прямоугольной матрицы/массива размера N x M в общем случае нужно создавать новую прямоугольную матрицу размером M x N, и просто заполнить результат, используя вложенные циклы.

Также можно проверить, является ли матрица квадратной, тогда будет не обязательно создавать новый массив, достаточно переставить элементы относительно главной диагонали:

public static int[][] trans(int[][] src) {
    int n = src.length;
    int m = src[0].length;

    if (n == m) {
        return transposeSquare(src);
    }

    int[][] dst = new int[m][n];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            dst[j][i] = src[i][j];
        }
    }
    return dst;
}
private static int[][] transposeSquare(int[][] arr) {
    for (int i = 0, n = arr.length; i < n; i++) {
        // select the elements only above the main diagonal
        for (int j = i + 1; j < n; j++) {
            int tmp = arr[i][j];
            arr[i][j] = arr[j][i];
            arr[j][i] = tmp;
        }
    }
    return arr;
}
→ Ссылка