В Java, как взять значения 2D-массива и сохранить их в другом 2D-массиве с другим размером столбца и строки? - PullRequest
0 голосов
/ 17 февраля 2019

Я делаю проект, в котором я должен сделать матрицы из 2D-массива.Одним из требований является преобразование 2D-массива 3x4 (со значениями, хранящимися в нем) в 2d-массив 6x2 (с теми же значениями)?

public int[][] covertMatrix(int[][] ma, int r, int c) {
        rw = r;
        col = c;

        this.ma = new int[rw][col];
        for (int i = 0; i < rw; i++) {
            for (int j = 0; j < col; j++) {
                ma[i][j] = ma[i][j];    
            }
        }
        return ma;
}

Я пробовал этот код, и он изменяет форму массива, нопечатает только двумерный массив нулей.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Эта версия перераспределяет значения в новый массив.

Вычисление индексов путем деления cellindex на столбцы, которые дают строку, и вычисления остатка, который дает новый столбец.

public int[][] covertMatrix(int[][] ma, int r, int c) {
    rw = r;
    col = c;
    int element = 0;
    int[][] ma2 = new int[rw][col];
    for (int i = 0; i < ma.length; i++) {
        for (int j = 0; j < ma[i].length; j++) {
           final int newRow = (element)/col; //integer division ignoring rest.
           final int newCol = (element)%col; // rest of the division.
           ma2[newRow][newCol] = ma[i][j];
           element++;
        }
    }
    this.ma = ma2;
    return ma2;
}



System.err.println(Arrays.deepToString(covertMatrix(new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12}},6,2)));
-> [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]
0 голосов
/ 17 февраля 2019

У вас есть начальная матрица 3x4, например

+--+--+--+--+
|01|02|03|04|
+--+--+--+--+
|05|06|07|08|
+--+--+--+--+
|09|10|11|12|
+--+--+--+--+

, которую вы хотите преобразовать в матрицу 6x2, например

+--+--+
|01|02|
+--+--+
|03|04|
+--+--+
|05|06|
+--+--+
|07|08|
+--+--+
|09|10|
+--+--+
|11|12|
+--+--+

. Для этого, очевидно, tab1[i][j] = tab2[i][j] будетне работа.Вам нужно перевести адрес между двумя массивами.На первый взгляд, использование по модулю для строки и оставшейся части деления для col будет иметь значение.

Что-то вроде

public static void main(String[] args) {
        int[][] tab1 = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        System.out.println(Arrays.deepToString(tab1));
        System.out.println("---------------------------");
        int size = tab1.length * tab1[0].length;
        for(int i = 1; i <= size; i++){
            int j = size % i;
            if(j == 0){
                convert(tab1, i, size/i);
            }
        }

    }

    private static void convert(int[][] tab1, int row, int col) {
        System.out.println(String.format("converting to %dx%d", row, col));
        int[][] tab2 = new int[row][col];
        for(int i = 0; i < row; i++){
            for(int j = 0; j < col; j++){
                int index = i*col + j;
                int newRow = index / tab1[0].length;
                int newCol = index % tab1[0].length;
                tab2[i][j] = tab1[newRow][newCol];
            }
        }
        System.out.println(Arrays.deepToString(tab2));
        System.out.println("---------------------------");
    }

, которые дают вывод

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
---------------------------
converting to 1x12
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
---------------------------
converting to 2x6
[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
---------------------------
converting to 3x4
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
---------------------------
converting to 4x3
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
---------------------------
converting to 6x2
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]
---------------------------
converting to 12x1
[[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]]
---------------------------
0 голосов
/ 17 февраля 2019

Вы можете изменить свой метод на:

public int[][] covertMatrix(int[][] ma, int r, int c) {
   int trans[][] = new int[r][c]; 
   int count = 0;  // used to increment the list elements

   // fetch all elements from the original array 'ma'
   List<Integer> collectList = Arrays.stream(ma).flatMapToInt(Arrays::stream)
                                     .boxed().collect(Collectors.toList());

   // assign the values from the list to resp array indices
   for (int i = 0; i < r; i++) {
       for (int j = 0; j < c; j++) {
           trans[i][j] = collectList.get(count);
           count++;
       }
   }

   return trans;
}

Логика:

  1. Создайте 2D-массив нужных вам размеров, здесь trans с r и c.
  2. Теперь соберите все элементы массива ma в список collectList
  3. Выполните итерацию по вновь созданному массиву, извлеките значения из списка и назначьте их соответствующиминдексы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...