答案:
感谢您的所有帮助!就像大多数人说的那样,解决方案是创建一个新的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;
}


然后,我对这个问题进行了几次不重要的检查,并重新计算了该fghNewBoard值。

然后,通过使用,将NewBoardfgh值一起放入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);时,键始终是相同的引用(认为存储器中的地址相同,尽管每次都有不同的内容)。

如果要为每个板状态在地图中存储一个新条目,则每次都必须创建一个新数组并复制+更改其内容。

10-02 08:10