Java-递归-矩阵修改
我有一个赋值,在这里我递归地修改一个自定义类型的矩阵。在递归之前,我试图制作矩阵的副本(“具有自定义类型的所有属性/变量的深度”副本)。然而,当递归返回时,原始矩阵已被修改,就好像它是递归地传递给方法(而不是副本)一样 在下面的代码中,使用g2调用“a”后修改了“g”: 复制功能: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++) {
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)