如何深度复制二维数组(不同行大小)

6

这是我第一次在这样的社区提问,所以我的问题格式可能不是很好,对此我表示抱歉。

现在我的问题是我想要在Java中深拷贝一个二维数组。当只有一维或者固定行列大小的二维数组时,拷贝起来非常容易。但我的主要问题是我不能为我尝试复制的第二个数组进行初始化,例如:

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

由于行大小不固定且在每个行索引中都会发生更改,例如我尝试复制此数组:

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

您看,如果我说new int[3][4],会有多余的空格,这不是我想要的。有没有一种方法可以深度复制这种二维数组?

4个回答

10

我想你的意思是列大小不固定。 无论如何,一个简单直接的方法是:

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;
}

太棒了,这正是我通常寻找的。感谢所有答案,它们都对我有所帮助 :) - user694368

2

你不必同时初始化两个维度:

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

这对您有帮助吗?


哦,这个信息很有帮助。我从来没有想过在不同的时间初始化维度。 - user694368

1
Java 8的lambda表达式使这很容易:

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

如果您认为这更清晰,JDK-8056051 修复后,您还可以编写 .map(int[]::clone)

-2
你可能需要像这样的东西:
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);
  }
}

1
你提出的代码是浅拷贝,对吗?arraycopy将会把环境数组中的每个值都复制到新数组中。也就是说,它将会复制原始行的引用,而不是子数组。 - helios
@rlibby和@Helios,你们确定它是浅拷贝吗?我认为它是深拷贝。如果是这样的话,让我重新审视一下。我可能错了。谢谢你们指出来。 - Shankar Raju
1
这是浅拷贝,你正在复制对一维数组的引用,你可以在代码后面添加这个进行检查:envoriment[2][0] = 5; 然后检查copyArray [2] [0]现在也是5。 - pgras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接