Нужно написать статическую функцию 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;
}