だから、私は自分自身を値HashMap
にマッピングするためにを使用しようとしています。私のオブジェクトは以下にあります(簡潔にするためにいくつかのコードが削除されています)Object
String
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());
}
}
テキストファイルからデータをロードすることにより、これらのオブジェクトの束を文字列にマッピングしています。後で、(独立した)ユーザー入力に基づいて、オブジェクトHashMap
を使用してクエリを実行しようとします。RouteHeadsignPair
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()
と、1つが見つかりますhashCode()
。これは、どちらも同じです。とhashCode()
が同じでtrueを返す場合、値を返してtrueを返すべきではありませんか?私はここで何が間違っているのですか?newKey
foundKey
foundKey.equals(newKey)
HashMap.get(key)
containsKey()