相同的对象,不同的结果

时间:2016-03-28 17:50:55

标签: java queue

所以我有这个通用对象State,尽管没有被编辑,它显然会改变它的价值。这就是我的意思 - 通过调用Queue中的相同元素,我得到了不同的结果。

System.out.println(mapString(que.element().getMapState()));
System.out.println(que.element());

结果:

the outcome

第二个结果是正确的。

缺少mapString方法只打印表char[][]

private static String mapString(char[][] map) {
    String mapString = "";
    for(int k = 0; k<map.length; k++) {
        for(int j = 0; j<map[k].length; j++) {
            mapString += map[k][j];
        }
        mapString += "\n";
    }
    return mapString;
}

虽然getMapState只返回State

中的私有变量
public char[][] getMapState() {
    return map;
}

QueueQueue<State>的类型,其中State是我的通用类型。我可以通过toString()方法打印它,从而产生第二个(正确的)结果。

public String toString() {
    return "Actual state:\n" + mapString;
}

mapStringString变量的位置,该变量在State类构造函数中使用相同的String mapString(char[][] map)方法启动。

public State(PlayerAddress player, HashMap<String, BoxAddress> boxList, char[][] map, String solution, String stateHash) {
    this.player = player;
    this.boxList = boxList;
    this.map = map;
    this.solution = solution;
    this.stateHash = stateHash;
    this.boxListString = boxListToString(boxList);
    this.mapString = mapString(map);
}

但是,稍后在代码中我不是在编辑Queue中的对象,但它编辑自己。可能是什么原因?我可以提供完整的代码,如果这会改变任何东西。

2 个答案:

答案 0 :(得分:0)

我们可能需要查看更多代码。两点:

  1. 方法mapString(char[][] map)在哪里宣布?您的商家信息显示为private static...,因此可能是在州级内。但是,您的代码:

    System.out.println(mapString(que.element().getMapState())); System.out.println(que.element());

  2. 似乎表明从州级外部调用mapString(),好像有第二个版本?

    1. 尝试暂时更改toString()以调用mapString()方法并重试。
    2. 除此之外,请显示所有代码。

      更新:感谢您的代码。看了之后,我唯一的想法就是Jorn Vernee在他之前的回应中走上正轨。虽然State中的构造函数包括:

      this.map = map.clone();

      这只是一个浅层克隆,因为没有克隆内层数组,所以影响不大。你可以试试深度克隆吗?即在构造函数中:

      char[][] newMap = map.clone();
      for (int i = 0; i < map.length; i++) {
         newMap[i] = map[i].clone();
      }
      this.map = newMap;
      

答案 1 :(得分:0)

出于某种原因,如果您执行此操作char[][] temp_map = que.element().getMapState(),然后再编辑代码中的temp_map,则队列中的第一个元素会更改其值

但说实话,这没有任何意义!有人可以解释一下吗?