【问题标题】:I used clone, but the original array is still affected我用了clone,但原来的数组还是受影响
【发布时间】:2011-11-27 17:50:26
【问题描述】:

我正在尝试用 Java 编写一个 3x3 平方位移谜题求解器。但是,我被困在我移动块的部分 - 我一直在使用我使用的算法得到一堆新的空白空间。经过一些测试,我确定这是因为尽管我使用了 clone() 命令,但当我更改“当前”时,v 的数组仍然受到影响。有谁知道这是为什么以及我该如何解决?我认为使用克隆后,我可以在不影响旧数组的情况下更改新数组。

    if (!rightwall)
    {
        int[][] current = v.state.clone();
        current[x][y] = current[x][y + 1];
        current[x][y + 1] = 0;
        State w = new State(current);
        w.distance = v.distance + 1;
        w.path = v;
        System.out.println("Right Shift:");
        w.print();
        q.insert(w);
    }

State 是一个表示二维数组以及一些属性的类 - State 代码的第一部分是

public class State {
int[][] state = new int[3][3];
int distance = 0;
boolean known = false;
State path = null;
State(int[][] newstate){
    state = newstate.clone();
}

v 是表示当前位置的状态。 w 然后将是在将空白空间与旁边的空间切换后创建的“相邻”位置。

q 是一个队列。

【问题讨论】:

  • 什么是vState 是什么? q 是什么?没有任何上下文,这段代码就没有任何意义。

标签: java


【解决方案1】:

在您的 State 类中,您需要确保所有属性都被深度复制。

【讨论】:

  • 我该怎么做?代码为 public class State { int[][] state = new int[3][3];整数距离 = 0;布尔已知 = 假;状态路径 = null; State(int[][] newstate){ state = newstate.clone(); }
  • 您实际上应该在构造函数中创建数组的新实例,然后将数组从源复制到目标
  • 您刚刚克隆了数组数组。这意味着您有一个新的外部数组,其中包含对与旧外部数组相同的内部数组的引用。您还应该克隆所有内部数组。见stackoverflow.com/questions/5563157/…
  • 谢谢!这完全解决了一切。
猜你喜欢
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2012-08-22
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多