[英]Hashcode for a class with 2 different fields Java
我似乎找不到此問題的解決方案:
示例1.1.1.1
示例1.2.1.1
其中第一列是主機名,第二列是ip。 這兩個信息用於組成Router.java
類的對象。 我想使用Router.java
對象作為Router.java
的鍵,並使用Boolean
作為值,即HashMap < Router,Boolean >
。
我要使用“ .containsKey”方法的方式是,它檢查字段之一( hostname
或ip
)是否相同,然后應返回true。 同樣在這種情況下,我想將與哈希圖中的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() {
}
}
我覺得找到一種方法來臨時解決問題,而錯誤的基礎是非常不好的做法。 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,只要未修改對象的equals比較中使用的信息,對x.equals(y)的多次調用將始終返回true或始終返回false。
對於任何非null參考值x,x.equals(null)應該返回false
您可能在使用收集對象中的Router
對象時遇到問題,並且在排序時可能會得到意想不到的結果。 同樣,在繼續工作時,代碼將遇到巨大的維護問題,任何查看您代碼的人都難以理解邏輯(在這種情況下,這實際上是錯誤的)。 具有這種代碼庫的項目的新來者將面臨噩夢。
重構是個好習慣,我們都會犯錯誤,但是更好的是我們學習,認識和糾正錯誤,並且不要繼續前進。
我希望您能按照這些方法的合同規定糾正邏輯並實現equals
和hashcode
。 祝你好運。
[更新]另外,我在下面看到@RustyX的答案( https://stackoverflow.com/a/42057421/504133 ),在您的情況下,您可以使用2個哈希圖,其中一個以IP為鍵,布爾值為值,以及第二個哈希圖主機名為鍵,布爾值為值。 在檢查路由器時,您可以檢查其IP是否存在於以IP為鍵的Hashmap中,或者是否存在以hostname為鍵的jn hashmap主機名。 在放置結果時,您需要看到的是不要在2個映射中放置沖突值。 希望通過很少的精心編寫的方法和檢查,您將能夠解決您的問題。 請注意,如RustyX在這種情況下所提到的,您可能不需要實現equals和hashcode來至少處理這種情況。
您要搜索兩個獨立的數據項。
因此,請使用兩個哈希映射,一個用於地址,另一個用於IP。 將相同的對象作為值存儲在兩個對象中。
您不需要實現任何hashCode。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.