Hashtable的get方法返回null



我正在尝试编写一个sokoban求解器的代码,我的代码可以工作,但计算解决方案需要很多时间。我想这是因为我使用了ArrayList,我试图使用Hashtable,但get方法不起作用,

Hashtable < Vertix, ArrayList<Vertix>> Graph;

所以当我填充我的哈希表,并使用键来获得列表时,我得到了null。

Graph.get(new Vertix(5,3));

然而vertex存在于Graph中。

如何解决这个问题以提高我的Sokoban求解器的速度。

Vertix是您自己的类吗?如果是这样的话,它需要有一个equals和hashcode方法的定义,以便与匹配值的其他实例进行比较。

否则,表中不存在您创建的new引用

此外,除非您需要线程安全,否则您可以使用Hashmap

您应该阅读HashMapHashTable的javadocs,其中解释了如何执行查找,以及对hashcodeequals方法的要求。

对您的问题最可能的解释是Vertix类没有覆盖Object::equalsObject::hashCode。因此,您的类正在继承"相等意味着相同的对象">来自CCD_ 10的行为。换句话说,每个Vertix实例并不等于其他每个Vertix实例。因此

new Vertix(5, 3).equals(new Vertix(5, 3)) 

评估为CCD_ 13。这可以解释为什么Graph.get(new Vertix(5,3))返回false


解决方案:覆盖equalshashCode,使它们具有适用于您的应用程序的正确属性。

参考:

  • Javaequals()hashCode()合同

请注意,代码片段中存在一些样式等错误。

  • 您可能应该使用HashMap而不是HashtableHashtable在理论上是线程安全的,但这是以获取和释放每个getput上的锁为代价的。如果您的代码是单线程的,那么这是不必要的。相反,如果您的代码是多线程的,那么Hashtable很可能成为并发瓶颈。

  • Graph是一个变量名,因此它应该以小写字母开头。

  • Vertix可能是拼写错误。图中节点的英文单词是";顶点";,而不是";vertex";。("Vertix"是GPS手表、多人射击游戏等的商标。(

最新更新