【问题标题】:2d Array not deep cloning, changes affect both arrays二维数组不是深度克隆,更改会影响两个数组
【发布时间】:2014-08-04 00:00:38
【问题描述】:

我需要克隆一个 Cell 对象的二维数组,但它不能正常工作。每当我克隆迷宫时,它都会克隆它,但是当我对其中一个进行更改时,它在另一个上也可见

有人知道问题出在哪里???

public void cloneMaze(boolean backup)
{
    if (backup) {
        backupMaze = (Cell[][]) maze.clone();
        for (int i = 0; i < maze.length; i++) {
            backupMaze[i] = (Cell[]) maze[i].clone();
        }
    } else {
        maze = (Cell[][]) backupMaze.clone();
        for (int i = 0; i < backupMaze.length; i++) {
            maze[i] = (Cell[]) backupMaze[i].clone();
        }
    }
}

【问题讨论】:

  • 请说明您所说的“进行更改”是什么意思。我怀疑您的意思是“maze[i][j].setFoo(...)”,这不是对数组的更改,而是对数组引用的对象的更改。您的副本仍然真正深 - 为此,您还需要克隆每个 Cell
  • 你在迷宫中储存了什么?数组中的对象是动态的吗?
  • Deep copy of an object array 的可能重复项
  • 迷宫中的物体在游戏开始时生成,并根据动作等变化。

标签: java arrays clone maze


【解决方案1】:

在您的备份迷宫中,您需要创建 new Cell 这是第一个迷宫的副本

否则你的两个迷宫都指向相同的对象,因此对单元格的修改会反映在两个迷宫中。

clone() 只是数组的浅拷贝,而您似乎在寻找深拷贝

【讨论】:

  • 但是如何将它们复制到新单元格?
  • 您可以像Cell(Cell cell)那样在Cell中复制一个构造函数,添加一个clone()方法,或者简单地创建一个new Cell()并正确设置它的所有属性。
  • 不适用于新的 Cell 方法。我根据其他单元格属性设置属性,但没有区别
  • 您需要将旧的 Cell 引用替换为对新 Cell 的引用。例如myCell = new Cell(myCell);
猜你喜欢
  • 2013-10-31
  • 2018-06-06
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2021-10-09
  • 2020-05-11
  • 2013-04-17
相关资源
最近更新 更多