【发布时间】:2015-10-20 15:11:50
【问题描述】:
答案: 感谢所有的帮助!就像你们大多数人所说的那样,解决方案是创建一个新的 2d int 数组,并从旧数组中复制值。这是我创建的函数,然后我可以将新板添加到 hashmap 中,作为新键。
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);
我初始化了 hashmap,对于程序的其余部分,我想遍历 map,以获得我需要的板。移动“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”变量中有一个板,我想将“0”向上移动一行。所以我调用了这个函数:
void moveUp(){
NewBoard = CurrentBoard;
memory = NewBoard[ZeroPositionX][ZeroPositionY - 1];
NewBoard[ZeroPositionY- 1][ZeroPositionX] = 0;
NewBoard[ZeroPositionY][ZeroPositionX] = memory;
}
然后我做了几个(对于这个问题)不重要的检查,并重新计算这个NewBoard 的fgh 值。
然后我继续将 NewBoard 与 fgh 值一起放入 hashmap 使用
map.put(NewBoard, fgh);
我的问题是它替换了哈希图中的当前键。换句话说,它不是向 hashmap 添加键和值,而是替换已经存在的键和值。我已尝试打印新版和当前版以确保它们不同。
当我打印hashmap 的entrySet() 时,它只会给我最新的条目。换句话说,董事会,以及移动“0”后的值。
for(Map.Entry mapentry : map.entrySet()){
System.out.println(mapentry);
}
为什么向hashmap 添加新的键和值不起作用?
尾注:我是 Java 新手,所以其中一些可能不是最理想的。如有必要,我会尽力详细解释。
【问题讨论】:
-
似乎您并没有真正创建一个新数组,而是更改了现有数组中的一些值。然而,这很难说。另请注意,
int[][]既不会覆盖equals也不会覆盖hashCode,这意味着如果您使用地图中不存在的键(同一实例),您将找不到该值。 -
你需要克隆你的板子,
-
除了@fabian 的评论之外,最好将
int[][]包装在一个类中并覆盖hashCode以使用java.util.Arrays.deepHashCode(yourArray)之类的东西。对于等号,您可以使用:java.util.Arrays.deepEquals(thisArray, thatArray)