2011-04-06 80 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後是固定的,如果你認爲這是更清晰。