2011-04-06 81 views
6

这是我在这样的社区中的第一个问题,所以我的问题格式可能不会很好。如何深度复制2维阵列(不同的行大小)

现在我的问题是我想在Java中深度复制2维数组。当在一维或甚至二维数组中使用固定大小的行和列来做它时非常容易。我的主要问题是我不能做初始化第二阵列我试图复制如:

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

由于行大小不是固定的,变化中的每一行指标如我尝试复制此阵:

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

所以你看,如果我说new int[3][4]会有额外的空间,我不想要。有没有一种方法可以深度复制这样的二维数组?

回答

11

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

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

好的一般解决方案 – 2011-04-06 08:22:24

+0

真棒,这是我一般寻求的。感谢所有帮助我的答案:) – Dagohan 2011-04-06 08:32:02

3

您不必初始化在同一时间两个维度:

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

帮助?

+0

哦,这个信息会有帮助。我从来没有想过在不同的时间初始化尺寸 – Dagohan 2011-04-06 08:21:03

-1

您可能需要这样的:

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

这是一个浅拷贝。 – rlibby 2011-04-06 08:14:25

+1

你提出的代码是浅拷贝,不是吗? arraycopy会将环境数组的每个值复制到新数组中。它是:它将复制引用到原始行。它不会复制子数组。 – helios 2011-04-06 08:16:16

+0

@rlibby和@Helios,你们确定它做了浅拷贝吗?我认为是做了一个深层次的复制。在这种情况下,让我重温一下。我可能错了。感谢您指出。 – Shankar 2011-04-06 08:47:37

1

的Java 8 Lambda表达式使这个容易:

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

你也可以写.map(int[]::clone)JDK-8056051后是固定的,如果你认为这是更清晰。