2017-03-22 10 views
-1

2D配列のディープコピーを作成できません。コピーメソッド内のforループでnullポインタ例外エラーが発生しています。また、以前のバージョンでは、ディープコピーを正しく作成していませんでした。私はそれを修正したと思ったが、今、エラーが表示されます。任意のヒント?2D配列のディープコピー

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という2D配列を作成していますが、deepCopyStringMatrix()を呼び出す前に何も入れていません。コピーでは、配列に何もないときにinput [0] .lengthを呼びます。その結果、(NULL).length – Dakoda

+0

@Dakodaこれは間違っています。 'input [0]'はnullではありません。 – 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

@Tom、そうです。文字列は不変なので、コンストラクタを使う必要はありません:) –

+0

はい、正しいですが、編集に新しい欠陥があります: 'Arrays.copyOf(test、test.length)'これは 'test'配列の浅いコピーを作成しますしたがって、「内側の」配列は正しく複製/コピーされません。 – Tom