Подтвердить что ты не робот

Скопируйте 2d-массив в java

У меня есть массив 2d, называемый матрицей типа int, который я хочу скопировать в локальную переменную в методе, чтобы я мог ее редактировать

Каков наилучший способ скопировать массив, у меня возникают проблемы

например

    int [][] myInt;
    for(int i = 0; i< matrix.length; i++){
        for (int j = 0; j < matrix[i].length; j++){
            myInt[i][j] = matrix[i][j];
        }
    }

    //do some stuff here
    return true;
}
4b9b3361

Ответ 1

Есть два хороших способа копирования массива - использовать клон и System.arraycopy().

Вот как использовать клон для 2D-случая:

int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
    myInt[i] = matrix[i].clone();

Для System.arraycopy() вы используете:

int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
  int[] aMatrix = matrix[i];
  int   aLength = aMatrix.length;
  myInt[i] = new int[aLength];
  System.arraycopy(aMatrix, 0, myInt[i], 0, aLength);
}

У меня нет теста, но я могу поспорить с моими 2 центами, что они быстрее и менее склонны к ошибкам, чем делать это самостоятельно. Особенно, System.arraycopy(), поскольку он реализован в собственном коде.

Надеюсь, это поможет.

Изменить: исправлена ​​ошибка.

Ответ 2

Можно использовать потоки в Java 8 для копирования 2D-массива.

@Test
public void testCopy2DArray() {
   int[][] data = {{1, 2}, {3, 4}};
   int[][] dataCopy = Arrays.stream(data)
             .map((int[] row) -> row.clone())
             .toArray((int length) -> new int[length][]);

   assertNotSame(data, dataCopy);
   assertNotSame(data[0], dataCopy[0]);
   assertNotSame(data[1], dataCopy[1]);

   dataCopy[0][1] = 5;
   assertEquals(2, data[0][1]);
   assertEquals(5, dataCopy[0][1]);
}

Ответ 3

Вы не инициализируете локальный 2D-массив.

int[][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
  myInt[i] = new int[matrix[i].length];
  for (int j = 0; j < matrix[i].length; j++)
  {
    myInt[i][j] = matrix[i][j];
  }
}

Ответ 4

вы также можете закодировать код myInt = matrix.clone();