堆栈中的push(int[][])复制的值与Java相同
我有一个二维数组和堆栈:堆栈中的push(int[][])复制的值与Java相同,java,stack,stack-trace,Java,Stack,Stack Trace,我有一个二维数组和堆栈: int[][] data = new int[][]; Stack<int[][]> undoList = new Stack<int[][]>(10); 那么为什么所有堆栈元素都具有相同的值呢?您正在对数组进行更改,但没有将数组本身放在堆栈上。。。您正在堆栈上放置对数组的引用。基本上,您多次推送相同的引用。如果需要独立的值,则需要独立的数组 把引用想象成有点像写在纸上的街道地址(纸通常是一个变量)。你现在得到的是一本书,每一页上都有相同的街道
int[][] data = new int[][];
Stack<int[][]> undoList = new Stack<int[][]>(10);
那么为什么所有堆栈元素都具有相同的值呢?您正在对数组进行更改,但没有将数组本身放在堆栈上。。。您正在堆栈上放置对数组的引用。基本上,您多次推送相同的引用。如果需要独立的值,则需要独立的数组
把引用想象成有点像写在纸上的街道地址(纸通常是一个变量)。你现在得到的是一本书,每一页上都有相同的街道地址。你可能在每一页上都写了字,然后去粉刷房子的前门,但这并不意味着我们可以看到所有不同的颜色——只涉及一栋房子。如果你想拥有很多不同房子的街道地址,有很多不同颜色的前门,你需要建造很多不同的房子…我通过复制代码解决了这个问题,正如@Marco13在上面的评论中提到的: 深度复制
public static int[][] deepCopyArray(int[][] oldArray){
int[][] newArray = new int[oldArray.length][];
for(int i=0; i<oldArray.length; i++)
{
newArray[i] = new int[oldArray[i].length];
for(int j=0; j<oldArray[i].length; j++)
newArray[i][j] = oldArray[i][j];
}
return newArray;
}
publicstaticint[]]deepCopyArray(int[]]oldArray){
int[]newArray=newint[oldArray.length][];
对于(int i=0;我觉得您正在使用存储在数据中的同一引用。请在将其推入堆栈之前创建一个新的int[][]
。这当然是重复的重复…但我没有找到此链的开头。@Marco13是data.clone()在这里工作?单个数组.copyOf
或data.clone()
将不够。在进行“某些更改”之前,您必须对数组进行深度复制。有关2D阵列上的深度复制示例,请参见示例和其他。我不确定效率在此处的哪一点起作用。您必须创建阵列的深度复制。这可以像链接答案中那样完成(无论行的长度是否不同-对于等长的行,您将以相同的方式完成)。或者,对于每一行,可以使用目标[i]=input[i].clone();
,而不是使用数组.copyOf
,但这也必须对每一行执行,因此没有显著差异。
public static int[][] deepCopyArray(int[][] oldArray){
int[][] newArray = new int[oldArray.length][];
for(int i=0; i<oldArray.length; i++)
{
newArray[i] = new int[oldArray[i].length];
for(int j=0; j<oldArray[i].length; j++)
newArray[i][j] = oldArray[i][j];
}
return newArray;
}