因此,我正在尝试使用a 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
Object
查询。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)
返回true,则不应该HashMap.get(key)
返回值并containsKey()
返回true?我在这里做错了什么?
您并没有覆盖Object.equals
- 由于参数类型,您正在 重载 它。您的 诊断 代码将调用您的重载,但映射代码则不会(因为它不知道)。
您需要一个签名为
public boolean equals(Object other)
如果您使用@Override
注释,则如果无法正确覆盖某些内容,则会收到错误消息。
您需要检查是否other
是RouteHeadSignPair
first,然后是cast
的实例。如果您将RouteHeadSignPair
班级定为最终班级,则无需担心班级是否完全相同,等等。
请注意,您的哈希码将不必要的碰撞,顺便说一句-如果你同时使用route
与
该headSign
哈希来生成散列码,它可以帮助你的地图查找更有效率。(如果有多个实例具有相同的路线但头部符号不同,则在查找键时地图不必检查所有实例是否相等时很有用。)
我想编写一个Java类,根据相关的时间戳计算一些规则(对于每个rueleId)的出现次数。 例如 输入: 输出: 我想我可以利用HashMap。 我认为这里的键是基于ruleId(type:String)和timestamp(type:Calendar)的,值是计数。 我怎样才能拥有基于两个不同对象的密钥?我的方法错了吗?
问题内容: 我想运行自己的内部pypi服务器,以便在组织内分发鸡蛋。 我发现了一些项目,例如: http://pypi.python.org/pypi/EggBasket/ http://plone.org/products/plonesoftwarecenter 据我了解,pypi.python.org使用名为Cheese Shop的软件。 我的问题: 为什么我不能使用奶酪店本身?(我找不到它,
问题内容: 与使用java.lang.Exception相比,您将在什么时候创建自己的异常类?(一直吗?仅在包外使用吗?仅当它必须包含高级逻辑时?等) 问题答案: 我认为您需要问自己一个完全不同的问题:“创建新异常给我或使用我的代码的开发人员有什么优势?” 实际上,它给您或其他人带来的唯一好处就是能够处理异常。这似乎是一个显而易见的答案,但实际上并非如此。您应该只处理可以合理恢复的异常。如果您抛出
我正在使用reverfit2、rxjava2和adapter-rxjava来实现我的http api调用。 如果我有很多api需要实现,并且每个单独的api实现都需要添加这两行: 我不想在每个api实现中添加它们。我想使用MyObservable作为api定义的结果类型。 我的想法如下所示: 我在https://github.com/square/reverfit/blob/master/reve
本文向大家介绍说一说自己对于 synchronized 关键字的理解 ?相关面试题,主要包含被问及说一说自己对于 synchronized 关键字的理解 ?时的应答技巧和注意事项,需要的朋友参考一下 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,sy
本文向大家介绍如何使用自己的原型访问JavaScript对象?,包括了如何使用自己的原型访问JavaScript对象?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过使用名为“ Object.create() ”的javascript方法创建自己的原型来访问现有对象。使用此方法,我们可以将属性从现有属性继承到新创建的原型。让我们简要地讨论一下。 语法 此方法采用现有对象并创建自己的原型,以便