我正在研究一个问题,我将棋盘状态表示为2d阵列。 我需要有能力看看我以前是否看过当前的电路板状态。
我想过使用一个HashMap对象,该对象将一个二维数组作为参数,然后创建其唯一的哈希值。然后我可以通过使用HashMap的“.contains()”方法查看HashMap对象是否包含我当前使用的任何板状态。
我感到困惑的是HashMap对象采用“key”和“value”参数。 我只需要一个简单地将2d数组作为参数并创建其唯一哈希值的对象,然后允许我使用“.contains()”和“.put()”方法。
我感觉我并没有真正理解hashMaps,所以我在哪里感到困惑?
答案 0 :(得分:4)
听起来你需要Set
,而不是Map
。正如您所说,Map
是一个键值结构。由于您只需要存储值(哈希码),因此您只需Set
即可。为了获得快速查找,HashSet
可能是您最好的选择。
只需计算每个状态的哈希码,检查它是否存在于HashSet
中,否则添加它。
答案 1 :(得分:2)
您可以使用数组包装器,它将实现哈希码,并且等于数组
class ArrayHolder {
int[][] a;
public ArrayHolder(int[][] a) {
this.a = a;
}
public boolean equals(Object obj) {
if (!(obj instanceof ArrayHolder)) {
return false;
}
return Arrays.deepEquals(a, ((ArrayHolder)obj).a);
}
public int hashCode() {
return Arrays.deepHashCode(a);
}
}
答案 2 :(得分:0)
首先,您不需要2D阵列,只需一个1D阵列就可以将所有信息放在同一个地方,而且非常简单,不那么复杂。为什么不使用String来存储电路板状态,只使用字符串数组来存储所有电路板状态? 我认为重要的是不使用套装,因为你可以重复你的棋盘状态,例如,如果两个球员都重复动作。 如果你不需要存储重复的板状态,你可以使用Set和set.add方法,它会告诉你它是否已经在Set中的字符串。
答案 3 :(得分:0)
将您的董事会实体包裹在名为Board的类中。覆盖hashCode并等于在您的情况下工作的方法。然后使用HashSet。
建议:可能不是最快的,但是定义最简单的写入equals / hashCode的方法是将您的板转换为String并将工作委托给String方法。 (您喜欢的IDE中的自动生成也可以。)