Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-递归-矩阵修改_Java_Recursion_Matrix_Copy - Fatal编程技术网

Java-递归-矩阵修改

Java-递归-矩阵修改,java,recursion,matrix,copy,Java,Recursion,Matrix,Copy,我有一个赋值,在这里我递归地修改一个自定义类型的矩阵。在递归之前,我试图制作矩阵的副本(“具有自定义类型的所有属性/变量的深度”副本)。然而,当递归返回时,原始矩阵已被修改,就好像它是递归地传递给方法(而不是副本)一样 在下面的代码中,使用g2调用“a”后修改了“g”: 复制功能: method a(Square[][]) { ... g2 = new Square[g.length][]; for(int d = 0; d < g.length; d++) {

我有一个赋值,在这里我递归地修改一个自定义类型的矩阵。在递归之前,我试图制作矩阵的副本(“具有自定义类型的所有属性/变量的深度”副本)。然而,当递归返回时,原始矩阵已被修改,就好像它是递归地传递给方法(而不是副本)一样

在下面的代码中,使用g2调用“a”后修改了“g”:

复制功能:

method a(Square[][]) {
    ...
    g2 = new Square[g.length][];
    for(int d = 0; d < g.length; d++) {
        g2[d] = Arrays.copyOf(g[d], g[d].length);
    }
    a(g2);
    //Here, g has been modified and not the original set of values
}
方法a(正方形[]){
...
g2=新正方形[g.长度][];
对于(int d=0;d
当您将数组作为参数传递时,它实际上是数组的参考点,因此当您在方法中修改参数时,您也直接更改数组的值。避免问题的最佳方法是在调用递归方法之前,创建一个单独的数组并逐个值地将原始数组的值复制到其中。这样,在程序结束时,就有了原始数组和修改后的数组

将数组作为参数传递时,它实际上是数组的参考点,因此在方法中修改参数时,也直接更改数组的值。避免问题的最佳方法是在调用递归方法之前,创建一个单独的数组并逐个值地将原始数组的值复制到其中。这样,在程序结束时,就有了原始数组和修改后的数组

Arrays.copyOf()生成浅拷贝,这意味着对原始对象所做的任何修改都将反映在所创建的拷贝中

我建议您迭代数组值并将其复制到新数组中,以便获得原始数组的深度副本。

数组。copyOf()生成浅层副本,这意味着对原始对象所做的任何修改都将反映在所创建的副本中


我建议您迭代数组值并将其复制到新数组中,以获得原始数组的深度副本。

数组。copyOf
不执行深度副本。您需要自己实现它(可能根本不使用
Arrays.copyOf


这个答案对如何实现对象复制有一些建议:(复制构造函数是最重要的建议)。

数组。copyOf
不执行深度复制。您需要自己实现它(可能根本不使用
Arrays.copyOf


这个答案对如何实现对象复制有一些建议:(复制构造函数是最重要的建议)。

谢谢你的回答。使用复制构造函数时,上面的任何代码是否仍然有效,或者是否需要执行“特殊”操作?因此,我可以执行以下操作并在递归后获得“g”的原始值吗?:g2=新的平方[g.length][];for(int d=0;d感谢答案。使用复制构造函数,上面的任何代码是否仍然有效,或者是否需要执行一些“特殊”操作?因此,我可以执行以下操作,并在递归后提供“g”的原始值吗?:g2=new Square[g.length][];for(int d=0;d)