我正在尝试编写一个sokoban求解器的代码,我的代码可以工作,但计算解决方案需要很多时间。我想这是因为我使用了ArrayList,我试图使用Hashtable,但get方法不起作用,
Hashtable < Vertix, ArrayList<Vertix>> Graph;
所以当我填充我的哈希表,并使用键来获得列表时,我得到了null。
Graph.get(new Vertix(5,3));
然而vertex存在于Graph中。
如何解决这个问题以提高我的Sokoban求解器的速度。
Vertix
是您自己的类吗?如果是这样的话,它需要有一个equals和hashcode方法的定义,以便与匹配值的其他实例进行比较。
否则,表中不存在您创建的new
引用。
此外,除非您需要线程安全,否则您可以使用Hashmap
您应该阅读HashMap
和HashTable
的javadocs,其中解释了如何执行查找,以及对hashcode
和equals
方法的要求。
对您的问题最可能的解释是Vertix
类没有覆盖Object::equals
和Object::hashCode
。因此,您的类正在继承"相等意味着相同的对象">来自CCD_ 10的行为。换句话说,每个Vertix
实例并不等于其他每个Vertix
实例。因此
new Vertix(5, 3).equals(new Vertix(5, 3))
评估为CCD_ 13。这可以解释为什么Graph.get(new Vertix(5,3))
返回false
。
解决方案:覆盖equals
和hashCode
,使它们具有适用于您的应用程序的正确属性。
参考:
- Java
equals()
和hashCode()
合同
请注意,代码片段中存在一些样式等错误。
您可能应该使用
HashMap
而不是Hashtable
。Hashtable
在理论上是线程安全的,但这是以获取和释放每个get
和put
上的锁为代价的。如果您的代码是单线程的,那么这是不必要的。相反,如果您的代码是多线程的,那么Hashtable
很可能成为并发瓶颈。Graph
是一个变量名,因此它应该以小写字母开头。Vertix
可能是拼写错误。图中节点的英文单词是";顶点";,而不是";vertex";。("Vertix"是GPS手表、多人射击游戏等的商标。(