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

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

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

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

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

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

Итак, вы видите, если я скажу new int[3][4], будут лишние пробелы, которые мне не нужны. Есть ли способ для глубокого копирования такого рода двумерного массива?

Ответы [ 4 ]

10 голосов
/ 06 апреля 2011

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

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;
}
2 голосов
/ 06 апреля 2011

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

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

Помогает ли?

1 голос
/ 24 октября 2014

Java 8 лямбды делают это легко:

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

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

0 голосов
/ 06 апреля 2011

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

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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...