2016-04-25 9 views
1

私は再帰的にカスタム型の行列を変更している割り当てを持っています。再帰の前に、私はマトリックスのコピーを作成しようとしています(カスタムタイプのすべての属性/変数を持つ "深い"コピー)。ただし、再帰が返された場合、元の行列は再帰的に(コピーではなく)再帰的に渡されたかのように変更されます。Java - 再帰 - 行列の変更

以下のコードでは、g2:

コピー機能:

method a(Square[][]) { 
    ... 
    g2 = new Square[g.length][]; 
    for(int d = 0; d < g.length; d++) { 
     g2[d] = Arrays.copyOf(g[d], g[d].length); 
    } 
    a(g2); 
    //Here, g has been modified and not the original set of values 
} 

答えて

0

は、パラメータとして配列を渡す、それが配列への参照点は、実際には、あなたがメソッド内のパラメータを変更する場合、あなたはまた、の値を変更します配列を直接。あなたの問題を避ける最良の方法は、別の配列を作成し、元の配列の値を値にコピーして再帰メソッドが呼ばれる前に値を取得することです。そうすれば、プログラムの終わりまでに元の配列と変更された配列が得られます。

0

Arrays.copyOf()は、元のオブジェクトに対する変更が作成されたコピーに反映されることを意味する浅いコピーを生成します。

元の配列のディープコピーを取得するには、配列の値を反復処理して新しい配列にコピーすることをお勧めします。

0

Arrays.copyOfディープコピーを実行しません。自分で実装する必要があります(おそらくArrays.copyOfは使用しないでください)。

この回答には、オブジェクトのコピーを実装する方法に関するいくつかの提案があります:How do I copy an object in Java?(コピーコンストラクタが最上位のアドバイスです)。

+0

答えをありがとう。コピーコンストラクタを使用すると、上記のコードのいずれかが動作するのでしょうか、何か特別なことをする必要がありますか?だから私は次のことを行うことができ、再帰の後に 'g'の元の値を利用できますか?g2 = new Square [g.length] []; (int d = 0; d