【问题标题】:Deep Copy 2 Dimensional Array深拷贝二维数组
【发布时间】:2012-08-06 06:23:51
【问题描述】:

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

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() 方法,但根据我上面的假设,它们都没有给出“正确”的深拷贝。

【问题讨论】:

  • 您遇到了哪些问题?你试过什么?你被困在哪里了?
  • 我在复制二维数组时遇到问题。我试过 clone() 但没用。
  • 我了解到您在复制二维数组时遇到了问题。你复制它有什么问题?你试过什么不起作用?你在哪里被复制卡住了?您需要更具体,否则很难提供帮助。
  • 看看这个 SO 问题:stackoverflow.com/questions/3947227/…
  • 你能解释一下你是如何在你的双重嵌套循环的主体的第一行没有得到 NullPointerException 的吗? OriginalArrayOfNode 是声明后的二维空数组,在此示例中您永远不会分配任何新对象。

标签: java generics data-structures multidimensional-array


【解决方案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 进行填充。

希望这一切对您有所帮助。

【讨论】:

  • 感谢您的回复 :) 让我试试你的方法,如果有效我会再次回复 :)
  • 我似乎无法让它工作。无论如何,我认为我只是将您的答案标记为已接受,因为我放弃了尝试制作深层副本而只是重新声明和重新填充新数组。无论如何谢谢:)
  • 谢谢伙计。听起来你可能把事情复杂化了 :) 希望你能解决。
【解决方案2】:

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

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

【讨论】:

  • 是的 :) 我发现了复杂性,因此我放弃了尝试进行深层复制并只是声明然后填充一个新数组。尽管我设法对数组进行了深度复制,但它在内存方面的效率与创建一个新数组一样低。无论如何谢谢:)
猜你喜欢
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多