だから、私は自分自身を値HashMapにマッピングするためにを使用しようとしています。私のオブジェクトは以下にあります(簡潔にするためにいくつかのコードが削除されています)ObjectString
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を使用してクエリを実行しようとします。RouteHeadsignPaircontainsKey()は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を返すべきではありませんか?私はここで何が間違っているのですか?newKeyfoundKeyfoundKey.equals(newKey)HashMap.get(key)containsKey()