2017-03-11 1 views
0

J'ai trouvé des questions similaires, mais aucune d'entre elles ne m'a vraiment aidé jusqu'à présent (ce qui signifie probablement que je fais quelque chose de mal, c'est pourquoi je suis ici).Utilisation de l'instance d'un objet comme clé HashMap

J'ai un HashMap Map<Integer, List<Book>> qui est censé avoir un comme la clé de IDStudent et la liste des Book qu'il a en sa possession la valeur. Bien que ne passant que le ID fonctionne comme la clé, je pense que ce n'est pas une approche assez orientée objet et que je devrais utiliser Student comme la clé (donc cela ressemblerait à: Map<Student, List<Book>>). J'ai essayé de l'utiliser, mais ensuite j'ai eu un tas d'erreurs quand j'ai essayé de retourner une liste Student donnée de Book, probablement parce que le Student n'a pas été trouvé. Mon professeur m'a suggéré de @Override les méthodes Java hashCode et equals, ce qui est logique, puisque c'est comme ça que HashMap compare les clés, mais je n'ai pas eu de succès là-dessus (je ne sais pas exactement ce que j'ai besoin de comparer pour voir si deux Student sont les mêmes, soi-disant, leur ID devrait fonctionner seul). Voici les méthodes substituées:

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + id; 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Student other = (Student) obj; 
    if (id != other.id) 
     return false; 
    return true; 
} 

Qu'est-ce que je fais mal? Toute lumière que vous pourriez jeter sur ce serait extrêmement utile. Merci d'avance!

+3

L'erreur est ailleurs. Publier un exemple minimal complet reproduisant le problème. –

+0

'if (id! = Other.id) return false; return true; 'Pourquoi avez-vous préféré cela à' return id.equals (other.id); '? –

Répondre

1

L'erreur semble être dans la méthode equals, à condition que votre id a des valeurs gamme cache de nombre entier à l'extérieur ie -128 - 127

if (id != other.id) // <-- Error 
     return false; 

de votre exemple, il semble que id est un objet Integer

== vérifie si les références sont égales, c'est-à-dire si elles pointent vers le même objet.

Pour les types primitifs, == vérifie si les valeurs sont égales.

java.lang.Integer est un type de référence. int est un type primitif.

Bien que dans le cas d'entier, == ne fonctionne que pour les nombres entre -128 et 127 comme machine virtuelle Java met en cache les valeurs

Vous devez changer pour

if (!id.equals(other.id)) 
      return false; 
+0

Possible, mais comme ceux-ci ressemblent à des méthodes générées automatiquement, je devinerais que id est une primitive. – BarrySW19

+0

Comme l'OP a utilisé un Integer comme une clé dans la carte, me fait croire que id est une instance entière – Rahul

+0

'if (! Id.equals (other.id)) renvoie false,' Pourquoi avez-vous préféré cela 'retourner id.equals (autre.id); '? –