具有 2 个不同字段 Java 的 class 的哈希码

Hashcode for a class with 2 different fields Java

我似乎找不到这个问题的解决方案:
a.example1.1.1.1
a.example1.2.1.1
其中第一列是主机名,第二列是 ip。 这两个信息用来组成一个classRouter.java的对象。我想将 Router.java 的对象用作 Hashmap 的键,将 Boolean 的对象用作值,即 HashMap < Router,Boolean >

我想使用“.containsKey”方法的方式是检查其中一个字段(hostnameip)是否相同,那么它应该 return 是的。同样在这种情况下,我想使散列映射中 Router.java askey 的对象对应的值为 true。

我的问题是我不知道如何编写散列方法以使两个对象具有相同的散列并转到.equals()。

 import java.util.Objects;

   `enter code here`public class Router {


   String hostname;
   String ip_address;
   String patched;
    String os_version;
    String notes;

    public Router(String hostname,String ip_address,String patched,String     os_version,String notes)
   {

    this.hostname = hostname;
    this.ip_address = ip_address;
    this.patched = patched;
    this.os_version = os_version;
    this.notes = notes;

   }


   @Override

   public boolean equals(Object o) {

    if (o == this) 
        return true;
    if (!(o instanceof Router)) {
        return false;
    }


    Router r = (Router) o;

    return r.hostname.equals(hostname) ||
            r.ip_address.equals(ip_address) ;

   }

   @Override
   public int hashCode() {






   }



   }

我觉得在错误的基础上找到一种临时解决问题的方法是非常糟糕的做法。错误地实施了 equals 方法。它与合同相矛盾,因此代码以后可能会出现很多问题。

假设Router有3个对象。

  1. 对象 1:routerA 主机名 = a.abc 和 ip = 107.108.109.100

  2. 对象 2:routerB 主机名 = a.abc 和 ip = 107.108.109.200

  3. 对象 3 : routerC 的主机名 = b.abc 和 ip = 107.108.109.100

    routerA.equals(路由器B); // 计算结果为 TRUE

    routerA.equals(路由器C); // 计算结果为 TRUE

    routerB.equals(路由器C); // 应该评估为 TRUE 但评估为 FALSE,根据 equals 合同这是错误的。

参考: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

  1. 是自反的:对于任何non-null参考值x,x.equals(x)应该return为真。

  2. 它是对称的:对于任何 non-null 参考值 x 和 y,当且仅当 y.equals(x) return 正确。

  3. 具有传递性:对于任何non-null参考值x、y、z,如果x.equals(y)returns true 并且 y.equals(z) returns 为真,那么 x.equals(z) 应该 return 为真。

  4. 是一致的:对于任何non-null参考值x和y,多次调用x.equals(y)一致return为真或一致return false,前提是没有修改对象的相等比较中使用的信息。

  5. 对于任何non-null参考值x,x.equals(null)应该return false

在集合对象中使用 Router 的对象时,您可能会遇到问题,而且在排序时,您可能会得到意想不到的结果。此外,在提前工作的同时,代码将存在巨大的维护问题,任何查看您的代码的人都将难以理解逻辑(在这种情况下实际上是错误的)。具有此类代码库的项目的新手将会做噩梦。

重构是一个好习惯,我们都会犯错误,但最好我们学习、认识并纠正错误,而不是继续犯错。

我希望你能纠正你的逻辑并根据为这些方法设置的合同实施 equalshashcode。祝你好运,干杯。

[更新] 我还在下面看到@RustyX 的回答,( ) 在您的情况下,您可以使用 2 个哈希图,一个以 IP 作为键,布尔值作为值,第二个哈希图以主机名作为键,布尔值作为值。在检查路由器时,您可以检查其 IP 是否存在于以 IP 为键的 Hashmap 中,或者主机名是否为以主机名为键的 preaent jn hashmap。在放置您需要查看的结果时,不要在 2 个地图中放置相互冲突的值。通过一些精心编写的方法和检查,希望您能够找到解决问题的方法。请注意,正如 RustyX 在这种情况下提到的那样,您可能不需要实现 equals 和 hashcode 来至少处理这种情况。

您想搜索两个独立的数据项。

因此使用两个哈希映射,一个用于地址,一个用于 IP。将相同的对象存储为它们中的值。

您不需要实现任何 hashCode。