IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[HashMap] Problèmes avec HashMap (redéfinition de HashCode etc.)


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut [HashMap] Problèmes avec HashMap (redéfinition de HashCode etc.)
    Bonjour,
    je vous expose brièvement mon problème :
    J'ai une méthode popListActivity de la classe Processor qui est appelé environ toute les 10 secondes pour mettre à jour des tableaux.

    Dans la classe Processor, il y a un HashMap static de type <SeanceIdent, Object>

    Voici le code de SeanceIdent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package Framework;
     
    public class IdentSeance {
    	private long activity;
    	private long seance;
    	public IdentSeance(long act, long s){
    		seance=s;
    		activity=act;
    	}
    	public long getActivity() {
    		return activity;
    	}
    	public long getSeance() {
    		return seance;
    	}
    	@Override
    	public int hashCode(){
    		//System.out.println("hash code appelé ! "+((String)(activity+""+seance)).hashCode());
    		return ((String)(activity+""+seance)).hashCode();
    	}
    }
    comme vous le voyez, j'ai redéfini la méthode hashCode.
    le but est que deux objets IdentSeance renvoient le même hashCode si les variables activity et seances sont identiques. et cela, ça marche.

    ce qui ne marche pas, c'est la HashMap.
    Scénario :
    - premier appel à popListActivity :

    on ajoute au HashMap une entrée avec un IdentSeance dont le hashcode à renvoyé 5000000 (exemple )

    - deuxième appel à popListActivity

    on recherche dans le HashMap une entrée donc le hashcode est égale à 5000000. Et ça renvoie ... NULL
    or moi je voudrais qu'il me renvoi l'objet précédemment enregistré, donc le hashCode de l'objet clé est 5000000 ...

    c'est là le problème. pourtant, les objet entré et demandé on exactement le même hashcode, mais ça ne marche pas ! pourtant, HashMap ne se base-t-il pas sur le hashCode pour les clés ?

    Merci beaucoup.

    NB

    bien sûr, je pourrai au lieu d'utiliser IdentSeance comme clé utilisé IdentSeance.hashCode(), seulement, j'aimerai garder IdentSeance en entier, au cas ou je voudrais parcourir le HashMap ...

    EDIT

    euh ... peut-être aurais-je mieux fait de posté ceci dans le forum sur java.util
    http://www.developpez.net/forums/f40...pis/java-util/

    je viens juste de le voir, je connais pas encore tous les sous-forum

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Comme indiqué dans la javadoc de hashcode() et de equals(), si vous redefinissez equals, vous devez redéfinir hashcode et vice versa.


    Aussi, je vous recommande plutot ce code (c'est ce que génère mon ide), plus rapide dans le calcul de hashcode (le votre étant assez catastrophique) et implémentant comme il se doit equals.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    	@Override
            public int hashCode() {
    	        final int prime = 31;
    	        int result = 1;
    	        result = prime * result + (int) (activity ^ (activity >>> 32));
    	        result = prime * result + (int) (seance ^ (seance >>> 32));
    	        return result;
            }
    	@Override
            public boolean equals(Object obj) {
    	        if (this == obj)
    		        return true;
    	        if (obj == null)
    		        return false;
    	        if (getClass() != obj.getClass())
    		        return false;
    	        IdentSeance other = (IdentSeance) obj;
    	        if (activity != other.activity)
    		        return false;
    	        if (seance != other.seance)
    		        return false;
    	        return true;
            }

  3. #3
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    Merci beaucoup !
    j'avais eu le même souci avec HashSet il y a un an ... mais je n'est pas fait la liaison avec HashMap, j'aurais du y pensé

    Sinon, désolé, pour le HashCode, je ne connaissait pas trop la technique à utiliser.

    (c'est ce que génère mon ide)
    même si ce n'est pas le sujet ... comment faites-vous pour demander à Eclipse de redéfinir par défaut ces deux méthodes ?

    Merci.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    menu -> source -> generate hashcode() and equals() et tu coche les champs à prendre en compte.

    Dans la même veine t'as le generate toString() et le generate Constructor using field

  5. #5
    Membre éclairé
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Par défaut
    merci beaucoup, je connaissait Generate Getters and Setters, mais j'avais pas regardé à côté

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je t'invite aussi à regarder quand t'as un truc souligné dans eclipse (rouge ou jaune) tout ce qui apparait quand tu met ton curseur dessus et que tu fais "ctrl - 1 (pavé numérique)"

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il faut aussi redéfinir equals(). Les méthodes hashCode() et equals() d'une classe doivent être modifiée ensemble.

    Soit c'est les deux, soit c'est aucune.

    Eh. Grillé pendant que je cherchais une ressource qui le dise
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec HashMap
    Par mimish dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 12/12/2011, 16h28
  2. Problème avec une HashMap (STL/SGI)
    Par nphilippe1684 dans le forum C++
    Réponses: 22
    Dernier message: 16/02/2011, 16h06
  3. problème d'écrassement avec hashmap
    Par robert_trudel dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 30/07/2008, 19h46
  4. Problème avec Hashmap et ArrayList!
    Par Angie73 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 11/05/2008, 21h31
  5. Problème avec le type HashMap
    Par GDMINFO dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 06/04/2007, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo