gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:43:48 25 4
gpt4 key购买 nike

我有以下对象 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>>();

现在, TreeMap 在一个名为 Graph 的类中使用,以存储当前在图中的节点,以及它们的一组边(来自 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));
}
}

我有时会得到以下信息:

HASHCODE: true EQUALS: true CONTAINS: false N: foo X: foo COMPARES: 0

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

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

最佳答案

这里有一些错误。

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

关于整数溢出问题,参见问题Why is my simple comparator broken?

关于java - 一致的 Equals() 结果,但不一致的 TreeMap.containsKey() 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2694526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com