Как глубоко скопировать 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 ответа:
Я думаю, что вы имеете в виду, что размер столбца не фиксирован. В любом случае простой и понятный способ был бы:
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 исправлен, если вы думаете, что это яснее.