深拷贝2维数组

时间:2012-08-09 03:37:41

标签: java generics data-structures multidimensional-array

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

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? 提前谢谢。

编辑:

我试图制作一个圆形双向链表的副本,其中有4个指针用于Knuth的Dancing Link算法。很难追踪问题的位置,但我假设如果原始数组由于Knuth的DL算法而给出“x”,那么原始数组的正确深度副本也会给出“x”作为结果,假设没有其他变量且没有随机修饰符。但是,我已经尝试了clone()方法,arrayutil.copy()方法,并且根据我的假设,它们都没有给出“正确的”深层复制。

2 个答案:

答案 0 :(得分: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
     }
}

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

我建议你做的是,在你的类节点中添加一个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(); }

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

最后,需要注意的另一点是,如果您尝试以您正在进行的方式进行深层复制,则可以使用ArrayUtil.copy(...)轻松地从索引1 - 200填充。

希望这一切都有所帮助。

答案 1 :(得分:1)

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

即使您可以忍受对所有节点进行强力搜索,或者您可以修改node数据结构以包含其自己的索引,也可能会出现以下链接形成的循环,这非常复杂任何确定复制东西的正确顺序的尝试。如果您可以保证有一系列链接可以遵循不会导致循环,并且您可以有效地确定每个节点的2d索引,那么您可能有机会。