2011-10-06 4 views
0

J'utilise jshashtable.js de Tim Down. Je peuplant deux tables de hachage différentes en utilisant l'objet clé suivante qui implémente les deux hashCode() et equals():jshashtable ne reconnaît pas les clés équivalentes

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); 
    }; 
} 

Je suis itérer alors plus d'un Hashtable et en utilisant containsKey() afin de décider si cette clé existe dans la table de hachage que je suis en train d'itérer et en ajoutant la nouvelle paire clé/valeur, ou non, en fonction du booléen retourné par la méthode containsKey(). Le problème que je vois est que bien que la méthode hashCode() alerte la même chaîne, l'objet equals() retourne false, donc il pense toujours qu'il a une nouvelle clé.

J'ai essayé d'utiliser une chaîne littérale comme clé aussi dId + '-' + oId, ce que je pensais devoir fonctionner aussi. Quand ce n'est pas le cas, j'ai essayé l'objet avec hashCode() et equals() qui ne semble pas non plus fonctionner. Il est peut-être intéressant de noter que oId pourrait être une chaîne de caractères "5" ou un nombre 5. Cependant, je pensais que puisque Javascript n'est pas fortement typé, cette différence ne devrait pas importer - d'autant plus, quand concaténée avec le dId + '-' ça devrait devenir une chaîne.

Des idées sur pourquoi les comparaisons ne semblent pas fonctionner? Merci à l'avance

Répondre

0

Il y a deux problèmes mineurs dans le code que vous avez posté:

  • Le premier paramètre dans votre déclaration de fonction doit être dId plutôt que did, mais je suppose que cela doit être une faute de frappe dans votre exemple ici parce que le code jette immédiatement lorsque Key est appelée;
  • alert("obj instanceof Key: " + obj instanceof Key); est trompeur: il alerte false car la priorité de l'opérateur le rend effectivement ("obj instanceof Key: " + obj) instanceof Key.

Autre que je ne peux pas trouver un problème et il semble fonctionner:

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 alertes, comme prévu.

+0

Tim - merci pour votre réponse rapide. Mon utilisation ressemble à -> \t 'var h1 = new Hashtable(); \t var h2 = nouveau Hashtable(); \t var k1 = nouvelle clé ("d", 6), k2 = nouvelle clé ("d", "6"); \t h1.put (k1, 1); \t h2.put (k2, 2); \t \t h2.each (fonction (clé, valeur) {\t \t \t \t \t alerte ("h2 a "+ key.hashCode() +":" + h2.containsKey (touche)); \t \t}); 'Cependant, cette utilisation fonctionne également dans cet exemple. Je vais enquêter plus loin. – MTurner

+0

Tim - J'ai trouvé mon erreur de logique qui me faisait croire que les clés comparaient. Merci encore! – MTurner