我在 Java 中用 Twowords 类封装了两个元素,这两个元素作为 Hashmap 的 Key 共同确定了 Hashmap 中的 Value ,但是我在写代码的过程中,需要判断 Twowords 对象是否在 Hashmap 里从而确定是否对 Value 赋值或者对 Value 进行自增操作。
但是我写的代码并不能判断 Hashmap 是否有 Key 值,问题应该出在 new 上,请问有没有好的解决办法?
HashMap<Twowords, Double> transitions = new HashMap<Twowords, Double>();
Twowords tmp = new Twowords(first, second);
if (transitions.containsKey(tmp)){
transitions.put(tmp, transitions.get(tmp) + 1.0);
}
else{
transitions.put(tmp, 1.0);
}
也就是说 if 判断永远为假,请问怎么解决呢? 谢谢!
1
bigredapple 2016-01-18 09:59:21 +08:00 1
hashcode
|
2
ilaipi 2016-01-18 09:59:51 +08:00 1
需要在`Twowords`里面重写 `hashcode()`和`equals()`两个方法
|
3
zts1993 2016-01-18 10:07:37 +08:00 1
不够理解 HashMap 的原理 啊。。。
|
5
anonymoustian OP @ilaipi 您好,我是重写了的。请问这个写的对吗?
public int hashCode(){ return element1.hashCode()+element2.hashCode(); } public boolean equals(Twowords o){ if(o.hashCode() == this.hashCode()){ return true; } return false; } |
6
anonymoustian OP @zts1993 你好,我重载了 hashCode 和 equals 方法的。
public int hashCode(){ return element1.hashCode()+element2.hashCode(); } public boolean equals(Twowords o){ if(o.hashCode() == this.hashCode()){ return true; } return false; } |
7
fwrq41251 2016-01-18 10:29:54 +08:00 1
有用 IDE 吗,eclipse 里面按 alt+shift+s 里面有一项 generate hashCode and equals..
|
8
otakustay 2016-01-18 10:30:09 +08:00 1
HashMap<Twowords, Double> transitions = new HashMap<Twowords, Double>();
这句看起来是个局部变量,也就是说每次运行代码都创建一个新的 HashMap ,那每次判断 containsKey 的时候这个 HashMap 都是空的,自然是 false …… 可能你贴出来的代码不全面,所以不好判断原因 |
9
ilaipi 2016-01-18 10:35:59 +08:00 1
@anonymoustian
element1 和 element2 是什么类型? 你的 hashCode 方法,得看你 element 类型的 hashCode 了 equals 方法这么写可能会出问题的。 3+5=4+4=1+7... 你网上搜下 hashCode 和 equals 方法的重写,有很多的例子 |
10
anonymoustian OP @ilaipi 您好,我把完整代码贴出来了,您能看一下吗?
|
11
anonymoustian OP @otakustay 您好,我把完整代码贴出来了,您能看一下吗?
|
12
zacard 2016-01-18 10:40:10 +08:00 1
hashcode 和 equals 方法写错了
|
13
anonymoustian OP @zacard 您看我写的哪里错了?
|
14
AccIdent 2016-01-18 10:45:49 +08:00 1
1. hashcode 和 equals 尽量不要自己写,而且你写的有问题
2. 你的 code 明显不可能有 key 啊, HashMap<Twowords, Double> transitions = new HashMap<Twowords, Double>();//new 的空 hashmap ,后面又没有 put ,能有 key 才有鬼呢 //话说代码没有格式看着难受 |
15
Infernalzero 2016-01-18 10:47:24 +08:00 1
IDE 直接生产下 hashcode 和 equals 方法就行了,你不重写的话就是调用 Object 的了,你每次 new 一个对象当然不等了
|
16
ilaipi 2016-01-18 11:01:49 +08:00 1
@anonymoustian
你的测试类的输出结果是? |
17
anonymoustian OP 问题解决了。 IDE 生成的 hashcode 和 equals 方法就可以了。谢谢大家!~
|
18
hantsy 2016-01-18 11:04:36 +08:00 1
选择可以 identify 两个对象的一些字段生成相应的 equals 和 hashcode 。
|
19
gy911201 2016-01-18 11:55:40 +08:00 1
问题出在 public boolean equals(Twowords o)上,你实际上没有覆写 equals , 而是重载了它,正确的 equals 只应该传入 Object 类型
|
20
wizardforcel 2016-01-18 13:51:11 +08:00 via Android 1
继承自 object 的 hashcode 是按照地址生成的,重新 new 一个当然不成了。
自己覆写 hashcode ,原理就是每个成员(也可以是部用于标识对象的分成员)的 hashcode 进行一定运算,搜一下就知道怎么做了。 |
21
kaedea 2016-01-18 13:59:45 +08:00 1
看下 containsKey 的源码立刻就知道了
|
23
iburu 2016-01-18 15:31:58 +08:00
这问题。。。
|
24
slixurd 2016-01-18 15:59:48 +08:00
@20015jjw hashcode 一样的确能处理,大不了就是退化成一条链表
但是楼主的 hash 和 equals 写的是一样的,那就其实都是逻辑相等了。 |
25
tonic 2016-01-18 16:34:19 +08:00
你并没有 `put tw3` 啊... 当然没有...
|
26
henryhuangs 2016-01-18 17:15:57 +08:00 via iPhone
equals 里面不要用 hashcode 对比,两个 element.equals 就行,另外 hashCode()里可以调用 apache 的 HashCodeBuilder
|
27
wuyadong 2016-01-18 19:50:47 +08:00
..... 要自己先学会找 bug
|
28
MRJ 2016-01-18 19:51:52 +08:00
基础没学好啊,要重写 hashcode 和 equals 方法
|