我一直在尝试对二维数组进行深度复制,但从未成功过。 这是我的代码。
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()方法,并且根据我的假设,它们都没有给出“正确的”深层复制。
答案 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索引,那么您可能有机会。