当前位置: 首页 > 知识库问答 >
问题:

Hashtable的方法get返回null

鲁钱明
2023-03-14

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

Hashtable < Vertix, ArrayList<Vertix>> Graph;

因此,当我填充哈希表,并使用键获取列表时,我得到空值。

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

然而,顶点存在于图形中。

如何解决此问题以提高Sokoban解算器的速度。

共有2个答案

唐高卓
2023-03-14

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

对您的问题最可能的解释是,Vertix类没有覆盖Object::equalsObject::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

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

参考:

  • Javaequals()hashCode()合同

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

>

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

    图形是一个变量名,所以它应该以小写字母开头。

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

  • 穆阳嘉
    2023-03-14

    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 当我使用: