2017-03-22 145 views
-1

我無法創建二維陣列的深層副本。它在複製方法的for循環中給我一個空指針異常錯誤。另外,在我之前的版本中,它沒有正確創建深層副本。我以爲我修好了,但現在錯誤出現了。有小費嗎?二維陣列的深度複製

public class Test { 

public static String[][] deepCopyStringMatrix(String[][] input) { 

    if (input == null) 
     return null; 
    String[][] result = new String[input.length][input[0].length]; 
    for (int r = 0; r < input.length; r++) { 
     for(int k = 0; k< input[0].length; k++) { 
      result[r][k] = new String (input[r][k]); 
     } 
    } 
    return result; 
} 

public static void printBoard (String [][] board, int m, int n) { 

    for(int i = 0; i < m; i++) { 
     for(int j = 0; j < n; j++) { 
      System.out.print(" /" + board[i][j] + "/ "); 
     } 
     System.out.println(); 
    } 
} 


public static void main (String args[]) { 
    String[][] test = new String[1][1]; 
    String[][] newTest = deepCopyStringMatrix(test); 

    test[0][0] = "One"; 

    newTest[1][0] = "Two"; 

    printBoard(test,1,1); 
    printBoard(newTest,1,1); 


} 

} 

編輯:在閱讀了一些答案後,我發現我遇到的問題,謝謝。

+0

那麼,使用多個空字符串初始化內部數組會很有意義,那麼'new String(input [r] [k])'不會再失敗。但是使用'new String()'沒有太大意義。 – Tom

+0

首先,在main()中,您正在創建一個名爲test的二維數組,但在調用deepCopyStringMatrix()之前不會放入任何東西。在副本中,當數組中沒有任何內容時,您正在調用input [0] .length。這會導致(NULL).length – Dakoda

+0

@達科達這是錯誤的。 'input [0]'不爲空。 – Tom

回答

0

使用java.util.Arrays.copyOf()。

實例:線

String[][] test = new String[1][1]; 
    String[][] newTest = Arrays.copyOf(test, test.length); 

下一個問題是:

newTest[1][0] = "Two"; 

您正在試圖寫入到不存在的細胞。

+0

沒有理由在代碼中使用建議的空檢查,就像沒有理由使用'new String()'。所以避免使用小代碼也會修復OP異常。 – Tom

+0

@湯姆,你是對的。字符串是不可變的,所以不需要使用構造函數:) –

+0

是的,這是正確的,但是您的編輯有一個新的缺陷:'Arrays.copyOf(test,test.length)'這會創建'test'數組的淺表副本,所以「內部」數組不會被克隆/複製正確。 – Tom