所以我有这个通用对象State
,尽管没有被编辑,它显然会改变它的价值。这就是我的意思 - 通过调用Queue
中的相同元素,我得到了不同的结果。
System.out.println(mapString(que.element().getMapState()));
System.out.println(que.element());
结果:
第二个结果是正确的。
缺少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;
}
Queue
是Queue<State>
的类型,其中State
是我的通用类型。我可以通过toString()
方法打印它,从而产生第二个(正确的)结果。
public String toString() {
return "Actual state:\n" + mapString;
}
mapString
是String
变量的位置,该变量在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
中的对象,但它编辑自己。可能是什么原因?我可以提供完整的代码,如果这会改变任何东西。
答案 0 :(得分:0)
我们可能需要查看更多代码。两点:
方法mapString(char[][] map)
在哪里宣布?您的商家信息显示为private static...
,因此可能是在州级内。但是,您的代码:
System.out.println(mapString(que.element().getMapState()));
System.out.println(que.element());
似乎表明从州级外部调用mapString()
,好像有第二个版本?
toString()
以调用mapString()
方法并重试。除此之外,请显示所有代码。
更新:感谢您的代码。看了之后,我唯一的想法就是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
,则队列中的第一个元素会更改其值
但说实话,这没有任何意义!有人可以解释一下吗?