我正在使用Tim Down的jshashtable.js。我正在使用以下Key对象填充两个不同的哈希表,该对象实现了hashCode()和equals():
function Key(did, oId){
this.dId = dId;
this.oId = oId;
this.hashCode = function(obj) {
//alert("hashCode: " + this.dId+"-"+this.oId);
return this.dId+"-"+this.oId;
}
this.equals = function(obj) {
//alert("obj.dId: "+ obj.dId + " this.dId: " + this.dId + "\nobj.oId: " + obj.oId + " this.oId: " + this.oId);
//alert("dId compare: " + obj.dId == this.dId + " oId compare: " + obj.oId == this.oId);
alert("obj instanceof Key: " + obj instanceof Key);
return (obj instanceof Key) &&
(obj.dId == this.dId) &&
(obj.oId == this.oId);
};
}
然后我迭代一个哈希表并使用containsKey()来判断这个键是否存在于我正在迭代的哈希表中,并根据返回的布尔值添加新的键/值对来自containsKey()。我看到的问题是虽然hashCode()方法警告相同的字符串,但是对象equals()返回false,因此它总是认为它有一个新的Key。
我尝试使用文字字符串作为键也dId +' - '+ oId,我认为它也应该起作用。如果没有,我尝试使用hashCode()和equals()这个对象似乎也不起作用。
也许值得注意的是oId可能是一个字符串“5”或一个数字5.但是,我认为由于Javascript没有强类型,这种差异无关紧要 - 特别是因为,当与dId +连接时' - '它应该成为一个字符串。
关于比较原因似乎不起作用的任何想法? 提前致谢
答案 0 :(得分:0)
您发布的代码中存在两个小问题:
dId
而不是did
,但我认为这里的示例必须是拼写错误,因为此处的代码会在Key
时立即抛出叫; alert("obj instanceof Key: " + obj instanceof Key);
具有误导性:它会提醒false
,因为运营商优先级会使其有效("obj instanceof Key: " + obj) instanceof Key
。除此之外,我找不到问题,似乎有效:
var h = new Hashtable();
var k1 = new Key(5, 6), k2 = new Key("5", "6");
h.put(k1, 1);
h.put(k2, 2);
alert(h.keys().length);
...警告1,正如所料。