2012-02-04 6 views
-1

J'ai créé une carte de hachage dans lequel chaque entrée correspond à 3 valeurs valeurs d'objets clés (qui sont au nombre de deux)HashMap (Java) donnant des résultats erronés

J'ai créé une classe, dont l'objet créer et stocker les résultats dans une carte de hachage Ceci est mon code ci-dessous dans lequel je compare mes données entrantes avec les valeurs précédentes dans la carte de hachage.Si les mêmes données viennent alors je juste incrémenter le compteur de ces données. J'ai pris les instructions d'impression dans la boucle for. Bien que les deux chaînes correspondent, mais mon code ne vient jamais dans la boucle if pour incrémenter le compteur.Pourquoi?

for(i=1;i<=hMap.size();i++) 
{ 
     String skey = Integer.toString(i); 
     if(hMap.get(skey).olddata==comingdata) 
     { 
      hMap.get(skey).counter= hMap.get(skey).counter+1; 
     } 
} 
+1

Vous ne comparez pas les objets avec '=='. –

+1

en d'autres termes, utilisez object.equals (otherObject) –

+0

comingdata est une chaîne et hMap.get (skey) .olddata est aussi une chaîne mais c'est une chaîne d'un objet – Natasha

Répondre

1

Vous ne comparez pas les objets avec == en Java, sauf si vous essayez de voir si elles ont la même valeur de référence .

if (hMap.get(skey).olddata.equals(comingdata)) { 
... 

Vous ne devriez pas non plus exposer olddata comme ça; il devrait être disponible via un getter; par exemple. getOldData()

1

On ne sait pas le type de olddata, mais peut-être vous devriez comparer les valeurs à l'aide equals():

if (hMap.get(skey).olddata.equals(comingdata)) 

En Java, == est utilisé soit pour comparer les types de données primitives pour égalité ou comparer les types d'objets pour identité. Si vous devez comparer deux types d'objet pour égalité, vous devez utiliser la méthode equals(), qui est définie pour tous les objets hérités de la classe Object, sachant que vous devez également remplacer equals() et hashCode() dans votre classe, en fournissant Implémentations significatives pour cette classe.

2

Vous n'avez pas donné d'informations sur les presque assez types impliqués, mais, mais je soupçonne fortement que c'est le problème:

if(hMap.get(skey).olddata==comingdata) 

Ce compareront références, plutôt que pour l'égalité, si olddata et comingdata sont des références d'une sorte quelconque. (EDIT: Par les sons de celui-ci, ils sont des références de chaîne.)

Je suppose que vous voulez:

String skey = Integer.toString(i); 
if(hMap.get(skey).olddata.equals(comingdata)) 
{ 
    hMap.get(skey).counter= hMap.get(skey).counter+1; 
} 

Ou plutôt de manière plus efficace, en évitant les recherches inutiles:

WhateverType value = hMap.get(Integer.toString(i)); 
if (value.olddata.equals(comingdata)) 
{ 
    value.counter++; 
} 

Je suggère également que si vous cherchez toujours un nombre entier, pourquoi ne pas utiliser une clé Integer au lieu de toujours convertir l'entier en une chaîne?

En outre, il est conseillé de suivre les conventions de dénomination Java, et vous devriez rendre vos champs privés s'ils ne le sont pas déjà.

Si rien de tout cela ne vous aide, veuillez poster plus de code. Les chances du problème étant dans HashMap plutôt que dans votre code sont incroyablement faibles.

0

Il devrait être

if(hMap.get(skey).olddata.equals(comingdata)) 
0

Voulez-vous dire en fait comingdata.equals(hMap.get(skey).olddata)? En outre, sachez que equals(Object) et hashCode() doivent être correctement implémentés.

+0

Johannes - les clés sont des instances de 'String', et je peux garantir que' String' implémente 'equals (Object)' et 'hashCode()' correctement. –

+0

vrai ;-) désolé à ce sujet ... – Johannes

Questions connexes