Pour quoi on fait int + String dans la méthode hashCode?

Résolu/Fermé
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014 - 26 juil. 2013 à 12:23
arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 - 26 juil. 2013 à 12:59
Bonjour,
j'ai fait une recherche sur le net concernant ces deux notions mais j'ai toujours un problème avec leurs méthodes.

je suis en train de suivre le tutoriel de site du zéro et j'ai pas compris ce code :

public int hashCode() {
//On définit un multiplication impair, de préférence un nombre premier
//Ceci afin de garantir l'unicité du résultat final
final int prime = 31;
//On définit un résultat qui sera renvoyé au final
int result = 1;
//On ajoute en eux la multiplication des attributs et du multiplicateur
result = prime * result + categorie;
result = prime * result + nbreHabitants;
//Lorsque vous devez gérer des hashcodes avec des objets dans le mode de calcul
//Vous devez vérifier si l'objet n'est pas null, sinon vous aurez une erreur
result = prime * result + ((nomPays == null) ? 0 : nomPays.hashCode());
result = prime * result + ((nomVille == null) ? 0 : nomVille.hashCode());
return result;
}

On peut générer ce code automatiquement via le menu Source/Generate hashcode and equals.

Ce que j'ai pas compris est:
Pour quoi ce prime = 31 et result=1?
Et la question la plus importante est pour quoi ils font la somme d'un entier et un String
(int prime*result + String categorie) c'est quoi cette somme ?????????

et merci


4 réponses

arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341
Modifié par arthurg95 le 26/07/2013 à 12:33
Bonjour,

Le principe d'un Hash est qu'il y en ai le moins d'identique possible pour avoir une répartition dans les tables (hashtab) par exemple quasiment égale.

Pourquoi prime = 31 ? Parce que c'est un nombre premier, tu aurais pu aussi bien mettre 37 ;)


Cette somme ne correspond à rien de concret, c'est la définition du hash ;)
A mon avis ici il utilise sont hash pour la méthode compareTo(), afin de définir la différence entre 2 villes, elle ne sont égales si et seulement si categorie=categorie, nbrHabitant = nbrHabitant, ...
Ce hash donne un identifiant unique (en théorie) à ta ville.

Mais dans tous les cas, vérifie sur categorie est bien un string, car on ne peut pas faire la somme d'un int et d'un string ;)
Tout est dit, mais comme personne n'écoute il faut toujours répéter
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
26 juil. 2013 à 12:35
merci beaucoup c'est très gentil.
Si j'ai bien compris, on ne peut pas deviner result vaut combien c'est ça ?
0
arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341
Modifié par arthurg95 le 26/07/2013 à 12:38
De rien ;)
Non pas du tout ! Tu peux l'afficher result même si tu veux, tu verras bien ce que ça donne ;)

Un conseil, n'essaye pas d'avancer trop vite dans le tuto en pensant avoir compris ;)
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
26 juil. 2013 à 12:43
Merci pour ton conseil :)
je voulais dire est ce qu'on peut deviner le résultat de hashCode avant l'exécution c'est à dire on fait les calculs juste pour vérifier, et j'ai dit "on ne peut pas" parce qu'on a cette somme "int+String" c ça le problème pour moi
0
arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341
26 juil. 2013 à 12:50
Ah c'est bien ce qui me semblait, categorie n'est pas un String, mais un char.
En fait un char, il est interprété par le code ASCII de la lettre, un "A" vaut 65 par exemple ;)
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
26 juil. 2013 à 12:53
oui c vrais c'est un char donc il va nous donner 96 pour cette ligne
ok merci beaucoup :)
0
arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341
26 juil. 2013 à 12:59
De rien, passe en résolu ;)
0