【问题标题】:push(int[][]) in a stack is duplicating the same value Java堆栈中的 push(int[][]) 复制相同的值 Java
【发布时间】:2014-08-29 16:50:00
【问题描述】:

我有一个二维数组和堆栈:

int[][] data = new int[][];
Stack<int[][]> undoList = new Stack<int[][]>(10);

我想在每次更改后添加数据以将其保留在撤消列表中:

undoList.push(data);
// some changes to data array
undoList.push(data);
// some changes to data array
undoList.push(data);

那为什么所有栈元素的值都一样呢?

【问题讨论】:

  • 看起来您正在使用存储在 data 中的相同引用。创建一个新的int[][],然后将其推送到您的Stack
  • 这肯定是一个副本的副本...但我没有设法找到这个链的开始。
  • @Marco13 data.clone() 在这里工作吗?
  • 单个Arrays.copyOfdata.clone() 就足够了。您必须在 进行“一些更改”之前制作数组的深层副本。有关 2D 数组的深拷贝示例,请参见 stackoverflow.com/a/5563301/3182664
  • 我不确定效率应该在什么时候发挥作用。您必须创建数组的深层副本。这可以像在链接的答案中那样完成(无论行是否具有不同的长度 - 对于等长的行,您将以相同的方式进行操作)。或者,可以使用target[i] = input[i].clone();,而不是对每一行使用Arrays.copyOf,但这也必须对每一行进行,因此没有显着差异。

标签: java stack stack-trace


【解决方案1】:

您正在对数组进行更改 - 但您并未将数组本身放入堆栈...您将 reference 放入堆栈中的数组。您基本上是多次推送相同的参考。如果你想要独立的值,你需要独立的数组。

将引用想象成有点像写在一张纸上的街道地址(纸通常是一个变量)。你现在得到的是一本书,每一页都有相同的街道地址。你可能已经在每一页上写字之间画了房子的前门,但这并不意味着我们可以看到所有这些不同的颜色——只涉及一个房子。如果你想拥有许多不同房屋的街道地址和许多不同颜色的前门,你需要建造许多不同的房屋......

【讨论】:

    【解决方案2】:

    正如@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;
        }
    

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 2014-11-29
      • 1970-01-01
      • 2011-08-25
      • 2015-12-25
      • 2022-01-02
      • 2011-12-03
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多