0

2 次元配列のディープ コピーを実行しようとしましたが、成功しませんでした。これが私のコードです。

class node {
    public node head;
    public node left;
    public node right;
    public node up;
    public node down;
}

node[][] OriginalArrayOfNode = new node[100][200];

//filling original node
for (int n = 0; n < 200; n++) {
     for(int m = 0; m < 100; m++) {
        OriginalArrayOfNode[m][n].head = OriginalArrayOfNode[m][0];
        OriginalArrayOfNode[m][n].left = ...
        //etc
     }
}

node[][]CopyArrayOfNode = new node[100][200];
//The code to copy the original array to new array should be here.

私の質問は、 OriginalArrayOfNode から CopyArrayOfNode へのディープコピーを作成するにはどうすればよいですか? 前もって感謝します。

編集 :

Knuth の Dancing Link Algorithm の 4 つのポインターを使用して、循環二重リンク リストのコピーを作成しようとしています。どこに問題があるのか​​を突き止めるのはかなり難しいですが、元の配列が Knuth の DL アルゴリズムの結果として "x" を与える場合、元の配列の正しいディープ コピーも結果として "x" を与えると思います。他の変数の変更やランダム修飾子がないことを条件とします。ただし、 clone() メソッド、 arrayutil.copy() メソッドを試しましたが、上記の仮定に基づいて「正しい」ディープコピーを提供するものはありません。

4

2 に答える 2

1

In my opinion, you're copying this in a very strange way; almost like you're trying to copy the wrong way around.

I'd do it more like this:

for (int m = 0; n < 200; m++) {
     for(int n = 1; n < 100; n++) {
        OriginalArrayOfNode[m][n].head = OriginalArrayOfNode[m][0].head;
        OriginalArrayOfNode[m][n].left = OriginalArrayOfNode[m][0].left;
        //etc
     }
}

Note: You should start n at 1, as you're copying from as you're copying from 0 to the others.

What I would suggest you do however, is add into your class node a clone() method. Clone would then provide an exact copy of the original class.

class node {
    public node head;
    public node left;
    public node right;
    public node up;
    public node down;

    public node clone() {
        final node clonedNode = new node();
        node.head = this.head;
        node.left = this.left;
        node.right = this.right;
        node.up = this.up;
        node.down = this.down;
    }
}


for (int n = 1; n < 200; n++) {
    OriginalArrayOfNode[n] = OriginalArrayOfNode[m].clone(); }

That's not the exact code at all, but you get what I'm meaning.

Finally, another thing to note is that if you're trying to deep copy in the way you're doing, you could easily just populate from index 1 - 200 using ArrayUtil.copy(...).

Hope all this helps.

于 2012-08-09T03:45:28.593 に答える
1

OriginalArrayOfNode同じ配列内の他のノードを参照するノードが含まれていると思いますか? nodeその場合、データ構造を強化して独自の 2d インデックスを含めない限り、ディープ コピーを実行することはできません。たとえば、 OriginalArrayOfNode[0][0].rightたまたま を参照した場合、オブジェクト ID を使用して古い配列を徹底的に検索しない限り、結果を に割り当てる前に、古い配列から新しい配列にOriginalArrayOfNode[15][27]インデックスのディープ コピーを行う必要があることを理解できません。.[15][27]CopyArrayOfNode[0][0].right

nodeすべてのノードに対してブルート フォース検索を実行したり、独自のインデックスを含むようにデータ構造を変更したりできたとしても、これらのリンクをたどることによって循環が形成される可能性が高く、正しい順序を決定する試みが非常に複雑になります。ものをコピーします。たどるリンクの特定のチェーンが循環を引き起こさないことを保証でき、すべてのノードの 2d インデックスを効率的に決定できる場合は、可能性があります。

于 2012-08-09T06:29:20.800 に答える