0

我一直在尝试对二维数组进行深度复制,但从未成功。这是我的代码。

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 算法制作一个带有 4 个指针的循环双向链表的副本。很难追踪问题出在哪里,但我假设如果原始数组给出“x”作为 Knuth 的 DL 算法的结果,那么原始数组的正确深层副本也会给出“x”作为结果,前提是没有其他变量变化且没有随机修饰符。但是,我尝试了 clone() 方法、arrayutil.copy() 方法,但根据我上面的假设,它们都没有给出“正确”的深层副本。

4

2 回答 2

1

在我看来,您正在以一种非常奇怪的方式复制它;几乎就像您试图以错误的方式复制一样。

我会更像这样:

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
     }
}

注意:你应该从 1 开始 n,因为你从 0 复制到其他人。

然而,我建议你做的是在你的类节点中添加一个clone()方法。然后克隆将提供原始类的精确副本。

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(); }

这根本不是确切的代码,但你明白我的意思。

最后,要注意的另一件事是,如果您尝试以您正在做的方式进行深度复制,您可以轻松地从索引 1 到 200 使用ArrayUtil.copy(...).

希望这一切都有帮助。

于 2012-08-09T03:45:28.593 回答
1

我假设OriginalArrayOfNode包含节点引用同一数组中的其他节点?在这种情况下,您将无法进行深度复制,除非您加强node数据结构以包含其自己的二维索引。例如,如果 OriginalArrayOfNode[0][0].right碰巧引用OriginalArrayOfNode[15][27],您将无法确定[15][27]在将结果分配给之前需要从旧数组到新数组的索引的深层复制,CopyArrayOfNode[0][0].right除非您使用对象标识彻底搜索旧数组.

即使您可以忍受对所有节点进行蛮力搜索,或者您可以修改node数据结构以包含其自己的索引,也可能会通过跟踪这些链接形成循环,从而使任何尝试确定正确顺序的尝试变得非常复杂复制东西。如果你能保证有一定的链接链可以遵循不会导致循环,并且你可以有效地确定每个节点的二维索引,你可能会有机会。

于 2012-08-09T06:29:20.800 回答