当前位置: 首页 > 面试题库 >

Equals()结果一致,但TreeMap.containsKey()结果不一致

房学文
2023-03-14
问题内容

我有以下对象Node

    private class Node implements Comparable<Node>(){
         private String guid();

         ...

         public boolean equals(Node o){
             return (this == o);
         }

         public int hashCode(){
              return guid.hashCode();
         }

         public int compareTo(Node o){
            return (this.hashCode() - o.hashCode());
         }

         ...

    }

我在以下使用它TreeMap

TreeMap<Node, TreeSet<Edge>> nodes = new TreeMap<Node, TreeSet<Edge>>();

现在,树形图用于一个称为的类中,Graph用于存储图形中当前存在的节点以及它们的边集(来自class Edge)。我的问题是当我尝试执行时:

   public containsNode(n){
        for (Node x : nodes.keySet()) {
            System.out.println("HASH CODE: ");
            System.out.print(x.hashCode() == n.hashCode());
            System.out.println("EQUALS: ");
            System.out.print(x.equals(n));
            System.out.println("CONTAINS: ");
            System.out.print(nodes.containsKey(n));
            System.out.println("N: " + n);
            System.out.println("X: " + x);
            System.out.println("COMPARES: ");
            System.out.println(n.compareTo(x));
            }
        }

我有时会得到以下信息:

哈希码:true等于:true包含: false N:foo X:foo比较数:0

有人知道我在做什么错吗?我对这一切仍然是陌生的,所以如果我忽略了一些简单的hashCode()事情TreeMap,我会事先道歉(我知道这并不重要,但我想我会包括在内)。

edit1:添加了compareTo()方法信息。


问题答案:

这里有些错误。

  • 您尚未覆盖Object.equals。使用@Override public boolean equals(Object obj)
  • 中存在潜在的整数溢出错误compareTo。这可能是导致此特定错误的原因。它将打乱排序,因此搜索可能不会成功。
  • compareTo方法声称,如果哈希码恰好匹配,则两个实例相等(如果不进行代码审查,这可能是很难捕获的错误)。

对于整数溢出问题,请参阅问题为什么我的简单比较器损坏了?



 类似资料:
  • 问题内容: 我有一个实现可运行的线程类和一个int计数器作为实例变量。两种同步方法add和sub。当我以某种方式运行测试类时,它几次会输出错误的结果。据我了解,当方法同步时,整个对象将被锁定以供其他线程访问,这种逻辑每次我们都应该获得相同的结果正确吗?事实并非如此。我想念什么吗? 我的机器是Windows 7、64位。 测试类 结果 注意: 您可能需要进行几次运行才能产生这种不一致。 问题答案:

  • 问题内容: 我正在尝试使用ZGEEV计算特征值和特征向量,但是在以不同的优化级别使用时,输出不正确且不一致也有些麻烦。以下是我的Fortran代码,结果为-O1和-O2优化级别。我还提供了Python代码进行比较。 我只能假设我打错了电话,但是我无法确定如何打电话。我相信我的LAPACK安装不太可能出现问题,因为我已经比较了Windows和Linux上两台不同计算机上的输出。 Fortran代码:

  • 我正在尝试对一个数组进行排序,但是一个值应该优先于所有其他值,这意味着它应该总是出现在排序数组的末尾。 我试着到处玩,试图找到一个合适的排序函数,但偶然发现了我不理解的结果。 你可以看到我的排序函数,在这两种情况下都是完全一样的。根据我的理解,如果a大于B,它应该返回1。的固定返回值难道不应该使2成为“最大”数吗?它似乎对第一个数组起作用,但对第二个数组不起作用,因此结果取决于输入数组。我尝试了很

  • 我正在将我的项目从Maven2(2.2.1)迁移到Maven3(3.1.0),我在jar版本上遇到了一些问题。当我试图追踪这个问题时,我从依赖插件中发现了一些不一致的结果,这让我很困惑。 当我在Maven3中尝试以下命令时: 结果是: 因此,结果表明将使用commons-codec-1.3.jar。(Maven3在打包时确实包含commons-codec-1.3.jar)。 但是,如果我将选项(-

  • 我正在尝试使用neo4j构建一个推荐引擎,并使用spring-data-neo4j作为持久层。我发现spring数据执行的cypher查询会给出结果,但是对于重复的对象,使用相同的数据集在neo4j浏览器上执行的相同查询会产生预期的结果。 下面是执行的查询(我通过启用调试获得)匹配(u:User)-[r:RATED]-(m:Movie)-[:HAS\u Movie]-(g:Genre)-[:HAS

  • 为什么结果是: =NaN =无穷大 我知道或除法有一点不同。我对得到的NaN非常满意,因为当某物除以零时,结果并不是定义的。但是为什么他们定义大于零除以零的结果是不独立呢?这和他们用来执行浮点除法的方法有关系吗?