所以,我試圖用HashMap
將我自己的Object
映射到String
值。我的目標是低於(有一些代碼簡潔,刪除)Java HashMap和key對象的問題我自己推出
public class RouteHeadsignPair {
String route;
String headsign;
public RouteHeadsignPair(String n_route, String n_headsign) {
route = n_route.toLowerCase();
headsign = n_headsign.toLowerCase();
}
public String getRoute() {
return route;
}
public String getHeadsign() {
return headsign;
}
public boolean equals(RouteHeadsignPair other) {
return(other.getRoute().equals(route) && other.getHeadsign().equals(headsign));
}
public int hashCode() {
return(route.hashCode());
}
}
我從一個文本文件映射將數據裝入串一串這些對象。稍後,基於(獨立)用戶輸入,我嘗試使用RouteHeadsignPair
對象查詢HashMap
。 containsKey()返回false,get()返回null,就好像我從未將鍵添加到地圖中一樣。但是,奇怪的是,如果我用下面的代碼(其中newKey
是從用戶輸入的RouteHeadsignPair
製造)
RouteHeadsignPair foundKey = null;
Iterator<RouteHeadsignPair> keysInMap = routeHeadsignToStopIdMap.keySet().iterator();
while(keysInMap.hasNext()) {
RouteHeadsignPair currKey = keysInMap.next();
if(currKey.equals(newKey)) {
System.err.println("Did find a key with an equals() == true!");
foundKey = currKey;
}
}
System.err.println("Value in map? " + routeHeadsignToStopIdMap.containsKey(newKey) + "(hashcode = " + newKey.hashCode() +
", equals = " + newKey.equals(foundKey) + ")");
System.err.println("foundKey in map? " + routeHeadsignToStopIdMap.containsKey(foundKey) + "(hashcode = " + foundKey.hashCode() +
", equals = " + foundKey.equals(newKey) + ")");
我的代碼格式道歉迭代在地圖上,這晚,我越來越暴躁
我得到以下輸出
Did find a key with an equals() == true!
然後
Value in map? false(hashcode = 1695, equals = true)
foundKey in map? true(hashcode = 1695, equals = true)
因此,如果我遍歷鍵並查找返回equals()
的鍵,我確實找到了一個,而這兩個鍵的hashCode()
都是相同的。如果hashCode()
與newKey
和foundKey
和foundKey.equals(newKey)
返回值相同,則不應該HashMap.get(key)
返回值並且containsKey()
返回true?我在這裏做錯了什麼?
我還建議他添加空值檢查或反向等於()調用 –
@EugenMartynov:我不確定你的意思是「反向調用」,但是,還有更多事情要做。將編輯。 –
贏家就是你!我需要刷新Java ... – Ivan