2012-08-09 108 views
0

我一直在尝试做2维数组的深拷贝,但从来没有成功。 这是我的代码。深拷贝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? 在此先感谢。

编辑:

我试着使循环双向链表的副本,其中4个指针Knuth的舞蹈链接算法。追踪问题的位置很难,但我假设原始数组由于Knuth的DL算法而给出“x”,那么原始数组的正确深度副本也会给出“x”作为结果,前提是没有其他变量变化并且没有随机修饰符。但是,我尝试过clone()方法,arrayutil.copy()方法,并且它们都没有根据我上面的假设给出“正确的”深层副本。

+0

你有什么问题吗?你有什么尝试?你卡在哪里? – user1118321 2012-08-09 03:42:30

+0

我无法复制我的2维数组。我试过克隆(),但它没有奏效。 – JrL 2012-08-09 03:55:10

+0

我知道您在复制2维数组时遇到问题。你有什么麻烦复制它?你尝试了什么不起作用?你在哪里坚持复制?你需要更具体,否则很难提供帮助。 – user1118321 2012-08-09 03:59:03

回答

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

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

最后,需要注意的另一件事是,如果您尝试按照自己的方式进行深度复制,则可以使用ArrayUtil.copy(...)从索引1 - 200轻松填充。

希望这一切都有所帮助。

+0

感谢您的回复:)让我试试你的方式,我会再次回复,如果它的作品:) – JrL 2012-08-09 04:24:05

+0

@frcb不用担心队友:) – 2012-08-09 04:29:46

+0

我似乎无法使它的工作。无论如何,我认为生病只是将您的答案标记为已接受,因为我放弃了尝试制作深层复制并重新声明并重新填充新阵列。无论如何谢谢:) – JrL 2012-08-09 04:44:24

1

我认为OriginalArrayOfNode包含引用同一阵列中的其他节点的节点?在这种情况下,您将无法进行深层复制,除非您加强node数据结构以包含其自己的2d索引。例如,如果OriginalArrayOfNode[0][0].right碰巧指的是OriginalArrayOfNode[15][27],则在将结果分配给CopyArrayOfNode[0][0].right之前,您将无法弄清楚是否需要从旧阵列到新阵列执行索引[15][27]的深层副本,除非您搜索旧阵列彻底使用对象身份。即使你可以忍受蛮力搜索所有节点,或者你可以修改node数据结构以包含它自己的索引,也可能会有通过跟随这些链接形成的循环,使任何尝试确定正确的顺序来复制事物。如果你可以保证有一定的链接链接不会导致循环,并且你可以有效地确定每个节点的二维索引,你可能有机会。

+0

是的:)我想到了复杂化,因此我放弃了试图做一个深层复制,然后声明然后填充一个新的数组。尽管我设法深度复制阵列,但它会像创建一个新的阵列一样效率低下。不管怎么说,还是要谢谢你 :) – JrL 2012-08-09 10:32:11