因此,我尝试使用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()
的键,我会找到一个,hashCode()
对于这两个键都是相同的。如果hashCode()
的{{1}}相同,而newKey
和foundKey
返回true,则不应该foundKey.equals(newKey)
返回值HashMap.get(key)
回归真的吗?我在这里做错了什么?
答案 0 :(得分:9)
您没有覆盖Object.equals
- 由于参数类型,您重载它。您的诊断代码会调用您的重载,但地图代码不会(因为它不知道它)。
您需要一个签名为
的方法public boolean equals(Object other)
如果您使用@Override
注释,如果您未能正确覆盖某些内容,则会收到错误消息。
您需要首先检查other
是RouteHeadSignPair
的实例,然后再进行投射。如果你使RouteHeadSignPair
课程成为最终成绩,你不必担心它是否完全相同,等等。
请注意,您的哈希码会不必要地发生冲突 - 如果您同时使用route
和 headSign
哈希来生成哈希码,则可能会有所帮助您的地图查找效率更高。 (如果有多个实例具有相同的路径但头部符号不同,则在查找密钥时,如果地图不必检查所有路由的相等性,则会很有用。)