我似乎找不到解决这个问题的方法:
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;方法是它检查其中一个字段(hostname
或ip
)是否相同,然后它应该返回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() {
}
}
答案 0 :(得分:1)
我觉得找到一种方法来暂时解决问题,而错误的基础是非常糟糕的做法。 equals方法被错误地实现了。它与合同相矛盾,因此代码有可能在以后遇到很多问题。
假设有3个Router
对象。
对象1:routerA
主机名= a.abc,ip = 107.108.109.100
对象2:routerB
主机名= a.abc,ip = 107.108.109.200
对象3:routerC
主机名= b.abc,ip = 107.108.109.100
routerA.equals(RouterB的); //评估为TRUE
routerA.equals(RouterC的); //评估为TRUE
routerB.equals(RouterC的); //应该评估为TRUE,但评估为FALSE,这是错误的,等于合同。
参考: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
它是自反的:对于任何非空引用值x,x.equals(x)应该返回true。
它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。
它是传递性的:对于任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,则x.equals (z)应该返回true。
它是一致的:对于任何非空引用值x和y,x.equals(y)的多次调用始终返回true或始终返回false,前提是没有修改对象的equals比较中使用的信息
对于任何非空引用值x,x.equals(null)应返回false
在收集对象中使用Router
的对象时可能会出现问题,并且在排序时可能会出现意外结果。此外,在提前工作时,代码将存在巨大的维护问题,任何查看代码的人都难以理解逻辑(在这种情况下实际上是错误的)。拥有此类代码库的项目的新成员将会做噩梦。
重构是一个很好的习惯,我们都会犯错误,但我们学习,实现和纠正它们并且不要继续前进。
我希望您能够根据这些方法的合同集纠正您的逻辑并实施equals
和hashcode
。祝你好运和欢呼。
[更新] 另外我在下面看到@RustyX的回答,(https://stackoverflow.com/a/42057421/504133)在你的情况下你可以使用2个哈希图,一个用IP作为键,布尔值作为值,第二个hashmap用hostname作为键,boolean作为值。在检查路由器时,您可以检查其IP是否存在于Hashmap中,其中IP为密钥,或者主机名是否为主,并且主机名为密钥。在放置结果时,您需要看到您没有在2个地图中放置冲突的值。很少有精心编写的方法和检查,希望您能够找到解决问题的方法。请注意,正如RustyX所提到的,在这种情况下,您可能不需要为至少处理这种情况实现equals和hashcode。
答案 1 :(得分:1)
您想要搜索两个独立的数据项。
因此使用两个哈希映射,一个用于地址,一个用于IP。将相同的对象存储在两个对象中。
您不需要实现任何hashCode。