具有2个不同字段Java的类的Hashcode

时间:2017-02-05 17:18:45

标签: java hashtable hashcode

我似乎找不到解决这个问题的方法:
a.example 1.1.1.1
a.example 1.2.1.1
其中第一列是主机名,第二列是ip。 这两个信息用于组成类Router.java的对象。我想使用Router.java的对象作为Hashmap的关键字,Boolean作为值HashMap < Router,Boolean >

我想用我的&#34; .containsKey&#34;方法是它检查其中一个字段(hostnameip)是否相同,然后它应该返回true。同样在这种情况下,我想在hashmap中将与Router.java askey这样的Object对应的值设为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() {






   }



   }

2 个答案:

答案 0 :(得分:1)

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

假设有3个Router对象。

  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(RouterB的); //评估为TRUE

    routerA.equals(RouterC的); //评估为TRUE

    routerB.equals(RouterC的); //应该评估为TRUE,但评估为FALSE,这是错误的,等于合同。

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

    1. 它是自反的:对于任何非空引用值x,x.equals(x)应该返回true。

    2. 它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。

    3. 它是传递性的:对于任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,则x.equals (z)应该返回true。

    4. 它是一致的:对于任何非空引用值x和y,x.equals(y)的多次调用始终返回true或始终返回false,前提是没有修改对象的equals比较中使用的信息

    5. 对于任何非空引用值x,x.equals(null)应返回false

    6. 在收集对象中使用Router的对象时可能会出现问题,并且在排序时可能会出现意外结果。此外,在提前工作时,代码将存在巨大的维护问题,任何查看代码的人都难以理解逻辑(在这种情况下实际上是错误的)。拥有此类代码库的项目的新成员将会做噩梦。

      重构是一个很好的习惯,我们都会犯错误,但我们学习,实现和纠正它们并且不要继续前进。

      我希望您能够根据这些方法的合同集纠正您的逻辑并实施equalshashcode。祝你好运和欢呼。

      [更新] 另外我在下面看到@RustyX的回答,(https://stackoverflow.com/a/42057421/504133)在你的情况下你可以使用2个哈希图,一个用IP作为键,布尔值作为值,第二个hashmap用hostname作为键,boolean作为值。在检查路由器时,您可以检查其IP是否存在于Hashmap中,其中IP为密钥,或者主机名是否为主,并且主机名为密钥。在放置结果时,您需要看到您没有在2个地图中放置冲突的值。很少有精心编写的方法和检查,希望您能够找到解决问题的方法。请注意,正如RustyX所提到的,在这种情况下,您可能不需要为至少处理这种情况实现equals和hashcode。

答案 1 :(得分:1)

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

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

您不需要实现任何hashCode。