小编典典

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

java

我有以下对象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()方法信息。


阅读 185

收藏
2020-11-26

共1个答案

小编典典

这里有些错误。

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

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

2020-11-26