答案:
感谢您的所有帮助!就像大多数人说的那样,解决方案是创建一个新的2d int数组,并复制旧数组中的值。这就是我做的功能,然后我可以将新的开发板添加到哈希图中,作为新的键。
void newboard(){
NewBoard = new int[N][N];
for(int n = 0; n < N; n++){
for(int i = 0; i < N; i++){
NewBoard[n][i] = CurrentBoard[n][i];
}
}
}
问题:
我有以下代码,将3x3板和整数列表(特别是(f,g,h))放入哈希图中。 Board
CurrentBoard
是未解决的8题。public static HashMap<int[][], List<Integer>> map = new HashMap<>();
map.put(CurrentBoard, fgh);
我初始化了哈希图,对于程序的其余部分,我想遍历该图,以获得所需的板子。在移动“
0
”位置之后,地图的每个条目都将是8拼图板的特定状态。这是我的方法。 'cv'变量只是选择具有最低“ f”值的面板(键)。
for(Map.Entry<int[][], List<Integer>> mapentry : map.entrySet()) {
if (cv > mapentry.getValue().get(0)) {
cv = mapentry.getValue().get(0);
CurrentBoard = mapentry.getKey();
fgh = mapentry.getValue();
}
}
现在,我在“
CurrentBoard
”变量中有了一个Board,我想将“ 0
”上移一行。所以我叫这个函数:void moveUp(){
NewBoard = CurrentBoard;
memory = NewBoard[ZeroPositionX][ZeroPositionY - 1];
NewBoard[ZeroPositionY- 1][ZeroPositionX] = 0;
NewBoard[ZeroPositionY][ZeroPositionX] = memory;
}
然后,我对这个问题进行了几次不重要的检查,并重新计算了该
fgh
的NewBoard
值。然后,通过使用,将
NewBoard
和fgh
值一起放入hashmap
map.put(NewBoard, fgh);
我的问题是,这取代了哈希图中的当前键。换句话说,它没有将键和值添加到哈希图中,而是替换了已经存在的键和值。我尝试打印新版和当前版,以确保它们不同。
当我打印
entrySet()
的hashmap
时,它只会给我最新的条目。换句话说,板子,以及移动'0
'之后的值。for(Map.Entry mapentry : map.entrySet()){
System.out.println(mapentry);
}
为什么将新的键和值添加到
hashmap
无效?尾注:我是Java的新手,所以其中一些可能不是最优的。如有必要,我将尽力详细解释。
最佳答案
您正在更改NewBoard
变量/数组的内容,但是引用保持不变。因此,当您调用map.put(NewBoard, fgh);
时,键始终是相同的引用(认为存储器中的地址相同,尽管每次都有不同的内容)。
如果要为每个板状态在地图中存储一个新条目,则每次都必须创建一个新数组并复制+更改其内容。