Как глубоко скопировать 2-мерный массив (разные размеры строк)


Это мой первый вопрос в сообществе, подобном этому, поэтому мой формат, о котором идет речь, может быть не очень хорошим, извините за это в первую очередь.

Теперь, когда моя проблема заключается в том, что я хочу глубоко скопировать массив 2 измерений в Java. Это довольно легко, когда вы делаете это в 1-м измерении или даже в массиве 2-х измерений с фиксированным размером строк и столбцов. Моя главная проблема заключается в том, что я не могу выполнить инициализацию для второго массива, который я пытаюсь скопировать, например:

int[][] copyArray = new int[row][column]

Поскольку размер строки не фиксирован и изменяется в каждый индекс строки, такой как я пытаюсь скопировать этот массив:

int[][] envoriment = {{1, 1, 1, 1}, {0, 1, 6}, {1}};
Итак, вы видите, что если я скажу new int[3][4], то появятся дополнительные пространства, которые мне не нужны. Существует ли метод глубокого копирования такого типа 2-мерного массива?
4 6

4 ответа:

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

public int[][] copy(int[][] input) {
      int[][] target = new int[input.length][];
      for (int i=0; i <input.length; i++) {
        target[i] = Arrays.copyOf(input[i], input[i].length);
      }
      return target;
}

Вам не нужно инициализировать оба измерения одновременно:

int[][] test = new int[100][];
test[0] = new int[50];

Помогает ли это ?

Java 8 lambdas делает это легко:

int[][] copy = Arrays.stream(envoriment).map(x -> x.clone()).toArray(int[][]::new);

Вы также можете написать .map(int[]::clone) после того, как JDK-8056051 исправлен, если вы думаете, что это яснее.

Вам может понадобиться что-то вроде этого:

public class Example {
  public static void main(String[] args) {

    int[][] envoriment = {{1, 1, 1, 1}, {0, 1, 6}, {1}};

    int[][] copyArray = new int[envoriment.length][];
    System.arraycopy(envoriment, 0, copyArray, 0, envoriment.length);
  }
}