我正在尝试编写一个sokoban求解器,我的代码可以工作,但是计算解决方案需要很多时间。我想这是因为我使用ArrayList,我尝试使用Hashtable,但是方法get不起作用,
Hashtable < Vertix, ArrayList<Vertix>> Graph;
因此,当我填充哈希表,并使用键获取列表时,我得到空值。
Graph.get(new Vertix(5,3));
然而,顶点存在于图形中。
如何解决此问题以提高Sokoban解算器的速度。
您应该阅读HashMap
和HashTable
的javadocs,其中解释了如何执行查找,以及对hashcode
和equals
方法的要求。
对您的问题最可能的解释是,Vertix
类没有覆盖Object::equals
和Object::hashCode
。因此,您的类继承了java中的“equality means same object”行为。lang.Object
。换句话说,每个Vertix
实例并不等于每个其他Vertix
实例。因此
new Vertix(5, 3).equals(new Vertix(5, 3))
计算结果为false
。这就解释了为什么Graph。get(新Vertix(5,3))
返回false
。
解决方案:重写equals
和hashCode
,使它们具有适用于应用程序的正确属性。
参考:
equals()
和hashCode()
合同请注意,代码片段中存在一些样式等错误。
>
您可能应该使用HashMap
而不是Hashtable
。Hashtable在概念上是线程安全的,但这是以获取和释放每个get
和put
上的锁为代价的。如果您的代码是单线程的,这是不必要的。相反,如果您的代码是多线程的,那么Hashtable
可能会成为并发瓶颈。
图形是一个变量名,所以它应该以小写字母开头。
Vertix
可能是拼写错误。图中节点的英文单词是vertex,而不是vertix。(Vertix是GPS手表、多人射击游戏等的商标。)
Vertix
是你自己的班级吗?如果是这样,它需要有一个equals和hashcode方法的定义,以便与具有匹配值的其他实例进行比较。
否则,表中不存在您创建的新的
引用。
此外,除非你需要线程安全,否则你可以使用Hashmap
在get方法中尝试在springboot中按id查找行时,收到一个空值。我在这里对数据库的调用是否有误? 存储库- 服务- 控制器-
问题内容: 我有一类这样的方法: 我如何在另一个类中调用此方法? 问题答案: 1. 如果要从中调用该方法的类位于同一包中,则创建该类的实例并调用该方法。 2. 使用 3. 最好有个赞等等。 例如:
我在Hibernate中遇到了一个奇怪的问题。有两个数据库表存储活动票据和已解析票据。在Java中有一个超类(Ticket)和实体子类(ActiveTicket和ResolvedTicket)。 现在,当解析票据时,它将被移动到ResolvedTicket表。 现在我有了一个定制的findByID方法,我尝试首先检索活动票据,然后如果我有一个null对象,那么我尝试检索已解析票据。看起来是这样的:
我是SNMP新手,我正在尝试使用SNMP操作,我正在使用http://techdive.in/snmp/snmp4j-snmp-get-example代码,但我无法获得预期的输出。我得到如下空响应: SNMP获取演示正在向代理发送请求。。。从代理Snmp获取响应获取响应=[1.3.6.1.2.1.1.1.0=Null] 当我试图为MIB RFC 1213的OID获取sysDescr时,预期的输出应
我尝试将Drools 7.4.1集成到tomcat中的webapp中。 当我调用以下语句以获取KieService时,我得到。 当从测试方法调用相同的方法时,这是正常的。 有人能帮忙吗?
所以我开始和Morphia一起工作,我遇到了一个奇怪的问题。 get(moviedetails.class,id) 我得到null 当我使用: