我是一名高中生,所以我为我可能滥用的条款道歉。
所以我正在制作一个幻灯片益智游戏,并在AI部分工作。所以我有一个构造函数构造板并分配其哈希码,如123456780.在我的A *算法中,我比较我生成的板(找到解决方案)是否已经在hashset中。所以我使用contains方法吧?但是contains方法如何检查两块板是否相同?
public Board()
{
board = new int [3][3];
setPieces (board);
hashCode = generateHashCode ();
}
这是我的构造函数之一。在我的board对象中,我有2D数组和hashcode。但我再次想知道,如果内置包含哈希集中的方法比较两个板哈希码。或者我需要写一个。
另外,当我将哈希码分配给一个主板时,我应该在我的构造函数中做到这一点吗?
谢谢你
答案 0 :(得分:1)
正如您所发现的,您需要在覆盖的hashCode()
方法中返回对象的哈希码。
您可以在该方法中计算哈希码,或者在ctor中计算哈希码并将其存储在字段中,然后在方法覆盖中返回该字段。
答案 1 :(得分:0)
任何使用' Hash' prefix通过其hashcode将集合中包含的所有对象存储在组中。因此,当您调用类似contains()
的方法时,集合将循环遍历每个哈希码组,并检查您解析的对象的哈希码是否与该组匹配。找到匹配项后,将使用存储对象的equals()
方法检查该哈希码组中的对象,直到Object
的{{1}}方法返回equals()
为止
如果不覆盖true
方法,则hashcode()
方法的Object
类实现会为每个Object
子类提供或多或少的唯一哈希码。如果您已经覆盖了hashcode()
方法,这可能会导致一些问题,因为如果两个对象被认为是相等的,那么如果哈希码不匹配,equals()
方法可能仍然找不到它。
实现contains()
时,Java Object API已经制定了合同或一组关于如何实现hashcode方法的规范。他们是;
hashcode()
,则必须始终返回相同的数字。hashcode()
方法认为两个对象相等,则其equals()
方法必须返回相同的值。hashcode()
方法不必将它们视为相等。<强>参考文献:强>