2011-10-06 56 views
0

我使用Tim Down的jshashtable.js。我使用的同時實現了hashCode()和equals()方法下面重點對象填充兩種不同的哈希表:jshashtable不識別等效鍵

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

有在你的代碼已經發布兩個小問題:

  • 在函數聲明中的第一個參數是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,符合市場預期。

+0

蒂姆 - 感謝您的及時回覆。我的用法如下 - > \t'var h1 = new Hashtable(); \t var h2 = new Hashtable(); var k1 = new Key(「d」,6),k2 = new Key(「d」,「6」); \t h1.put(k1,1); (k2,2); \t \t h2.each(功能(鍵,值){\t \t \t \t \t警報( 「H2具有 」+ key.hashCode()+「:」 + h2.containsKey(鍵)); \t \t});'但是這個用法也適用於這個例子。我會進一步調查。 – MTurner

+0

蒂姆 - 我發現我的邏輯錯誤,導致我相信鍵比較。再次感謝! – MTurner