创建哈希码() 方法 - Java

2022-09-02 12:23:38

我在为我创建的类编写方法时遇到了一些麻烦。此类旨在用于树集,因此,它实现了可比性。该类具有以下变量:hashCode()

public class Node implements Comparable<Node> {
   Matrix matrix;
   int[] coordinates= new int[2];
   Node father;
   int depth;
   int cost;

下面是该方法的实现。我希望按成本组织这些 Node 结构,因此,返回简单减法的结果。compareTo()TreeSetcompareTo()

public int compareTo(Node nodeToCompare) {
    return this.cost - nodeToCompare.cost;
}

我还实现了一个方法。equals()

public boolean equals(Object objectToCompare) {
    if(objectToCompare== this) {return true;}
    if(objectToCompare== null || objectToCompare.getClass()!= this.getClass()) {return false;}

    Node objectNode= (Node) objectToCompare;
    return this.father.equals(objectNode.father) &&
            this.depth== objectNode.depth &&
            this.cost== objectNode.cost &&
            this.matrix.equals(objectNode.matrix) &&
            Arrays.equals(this.coordinates, objectNode.coordinates);
}

说了这么多,我有几个问题:

  1. 既然我实现了一个新方法,我应该实现一个新方法吗?equals()hashCode()
  2. 如何使用这些变量实现新的哈希码?(请注意,Matrix类型的变量矩阵已经实现了一个方法)method()hashCode()

就这样!


答案 1

你的方法与你的方法不一致:你的方法说,如果两个实例具有相同的实例,那么它们就是等价的——使得 a 最多只能包含一个给定的实例——但你的方法说,只有当它们具有相同的实例并且以其他各种方式相同时,它们才是等价的。compareToequalscompareTocostTreeSetcostequalscost

因此,假设您的方法是正确的:equals

  • 您需要修复您的方法以使其与之保持一致。compareTo
  • 您需要创建一个与它一致的方法。我建议使用与java.util.List.hashCode()相同的逻辑,这是一种以特定顺序组装组件对象哈希代码的简单而有效的方法;基本上你会写这样的东西:hashCode
    int hashCode = 1;
    hashCode = 31 * hashCode + (father == null ? 0 : father.hashCode());
    hashCode = 31 * hashCode + depth;
    hashCode = 31 * hashCode + cost;
    hashCode = 31 * hashCode + matrix.hashCode();
    hashCode = 31 * hashCode + java.util.Arrays.hashCode(coordinates);
    return hashCode;

答案 2

Intellij IDEA可以将其作为“右键单击”功能来完成。只是看到它正确地完成会教你很多东西。

无论如何,您都应该覆盖两者。