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 :

Problème de Map (Hashtable)


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut Problème de Map (Hashtable)
    Bonjour je débute avec les Map en java et je n'arrive pas à récupérer les valeurs que je mets dans ma Map, enfin lorsque je le fais localement dans une méthode ça marche, mais en dehors ça ne marche plus.

    Je vous mets mon exemple tout simple, la clé est un couple d'entiers (i, j) et la valeur dans la map est un entier

    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
    public class testMain {
     
    	public static void main(String[] args) {
     
    		mapTest map = new mapTest();
     
    		// Insert values.
    		map.addValue(1, 1, new Integer(1100));
    		map.addValue(1, 2, 1200);
    		map.addValue(new Integer(1), new Integer(3), new Integer(1300));
     
    		// Display map. (OK ça marche)
    		System.out.print(map.getMap() + "\n");
     
    		// Display values. (ne marche pas, renvoie null à chaque fois)
    		map.print(1, 1);
    		map.print(1, 2);
    		map.print(new Integer(1), new Integer(3));
    	}
    }
    ça c'est ma classe avec la Map :

    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
    25
    26
    27
    public class mapTest {
     
    	private Map<pairInteger, Integer> m_mapTest = new Hashtable<pairInteger, Integer>();
     
    	public void addValue(int i, int j, int value){
     
    		pairInteger pair = new pairInteger(i, j);
     
    		if (pair != null){
    			m_mapTest.put(pair, value);
     
    			// Display value. (Là ça marche bizarrement)
    			System.out.print((Integer)m_mapTest.get(pair) + "\n");
    		}
    	}
     
    	public void print(int i, int j){
     
    		pairInteger pair = new pairInteger(i, j);
     
    		if (pair != null){
    			System.out.print((Integer)m_mapTest.get(new pairInteger(pair)) + "\n");
    		}
    	}
     
    	public Map<pairInteger, Integer> getMap() { return m_mapTest; } 
    }
    Et ça c'est le "pairInteger" :

    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
    public class pairInteger {
     
    	private int m_i;
    	private int m_j;
     
    	public pairInteger(int i, int j) {
    		m_i = i;
    		m_j = j;
    	}
     
    	public pairInteger(pairInteger pair){
    		m_i = pair.getM_i();
    		m_j = pair.getM_j();
    	}
     
    	public int getM_i() {	return m_i; 	}
     
    	public void setM_i(int m_i) {	this.m_i = m_i; 	}
     
    	public int getM_j() {	return m_j; 	}
     
    	public void setM_j(int m_j) {	this.m_j = m_j; 	}
    J'ai mis le code tel qu'il est en l'état mais j'ai essayé plein de choses avant, au niveau des news, des syntaxes différentes, des classes de map différentes ("Hashtable" qui suffit dans mon cas mais également avec "HashMap" pour tester), j'ai essayé avec une clé de type entier mais ça ne marchait pas non plus, donc là je sèche

    Merci à vous.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Oui, il y a un truc que tu pouvais pas deviner, à propos d'utiliser ta classe PairInteger comme clé de Map :

    Pourquoi et comment redéfinir la méthode hashCode() ?

    Pourquoi et comment redéfinir la méthode equals() ?

    Java ne peut pas les deviner tout seul. C'est toi qui a créé cette classe, donc tu dois définir comment marchent ces méthodes. C'est comme ça.

    Je vais quand même te faire gagner du temps : hashCode() n'a pas besoin d'être très compliquée. Ça ira très bien si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public int hashCode() {
      return m_i ^ m_j;
    }
    Pour equals(), la FAQ donne assez d'aide.

    On notera que Hashtable est obsolète et qu'il vaut mieux utiliser HashMap. Ça fait peu de différences et ton problème n'est pas là, mais autant faire directement comme il faut.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,




    Déjà attention aux conventions de nommage : les noms de classe commencent par une majuscule, contrairement à ton code (testMain, mapTest, pairInteger).
    Cela ne le rend pas évident à lire...


    Sinon sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public void print(int i, int j){
     
    		pairInteger pair = new pairInteger(i, j);
     
    		if (pair != null){
    			System.out.print((Integer)m_mapTest.get(new pairInteger(pair)) + "\n");
    		}
    	}
    Le if (pair != null) ne sert à rien : tu crées l'objet il ne peut pas être null.
    De même le new pairInteger(pair) ne sert à rien (à quoi bon créer un nouvel objet ?).



    Sinon Hashtable c'est l'ancienne API datant d'avant 1998.
    Il n'y a pas de raison de l'utiliser, sauf à rester compatible avec de vielles librairies...
    Bref utilise HashMap ! On est en 2014 après tout...




    Quand à ton problème, il vient du fait que tu n'as pas redéfini les méthodes equals()/hashCode() dans la classe "PairInteger" utiliser en clef.
    Cf la FAQ pour plus de détail :
    http://java.developpez.com/faq/java/...#DIVERS_equals
    http://java.developpez.com/faq/java/...IVERS_hashCode


    [edit] grillé

    a++

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Oui, il y a un truc que tu pouvais pas deviner, à propos d'utiliser ta classe PairInteger comme clé de Map :

    Pourquoi et comment redéfinir la méthode hashCode() ?

    Pourquoi et comment redéfinir la méthode equals() ?

    Java ne peut pas les deviner tout seul. C'est toi qui a créé cette classe, donc tu dois définir comment marchent ces méthodes. C'est comme ça.

    Je vais quand même te faire gagner du temps : hashCode() n'a pas besoin d'être très compliquée. Ça ira très bien si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public int hashCode() {
      return m_i ^ m_j;
    }
    Pour equals(), la FAQ donne assez d'aide.

    On notera que Hashtable est obsolète et qu'il vaut mieux utiliser HashMap. Ça fait peu de différences et ton problème n'est pas là, mais autant faire directement comme il faut.
    AH merci pour les liens et l'exemple de Hashcode, j'aurais pas deviné parce qu'au moment ou je fais le "put" et que je récupère aussitôt la valeur ça marche correctement.

    Et puis avec une clé de type Integer ça ne marchait pas non plus, pourtant je ne dois pas être obligé de redéfinir hashCode dans ce cas.



    Citation Envoyé par adiGuba Voir le message
    Salut,

    Déjà attention aux conventions de nommage : les noms de classe commencent par une majuscule, contrairement à ton code (testMain, mapTest, pairInteger).
    Cela ne le rend pas évident à lire...


    Sinon sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public void print(int i, int j){
     
    		pairInteger pair = new pairInteger(i, j);
     
    		if (pair != null){
    			System.out.print((Integer)m_mapTest.get(new pairInteger(pair)) + "\n");
    		}
    	}
    Le if (pair != null) ne sert à rien : tu crées l'objet il ne peut pas être null.
    De même le new pairInteger(pair) ne sert à rien (à quoi bon créer un nouvel objet ?).



    Sinon Hashtable c'est l'ancienne API datant d'avant 1998.
    Il n'y a pas de raison de l'utiliser, sauf à rester compatible avec de vielles librairies...
    Bref utilise HashMap ! On est en 2014 après tout...




    Quand à ton problème, il vient du fait que tu n'as pas redéfini les méthodes equals()/hashCode() dans la classe "PairInteger" utiliser en clef.
    Cf la FAQ pour plus de détail :
    http://java.developpez.com/faq/java/...#DIVERS_equals
    http://java.developpez.com/faq/java/...IVERS_hashCode


    [edit] grillé

    a++
    Merci à vous, oui pour le nommage des classes en plus je viens du C++ où on comment toujours les noms par une majuscule la honte
    pour le if (pair != null) je sais mais en fait j'ai passé mon week-end sur mon problème là et n'y comprenant plus rien j'ai ajouté des tests qui ne servent à rien je sais mais dans le doute je me suis dit .... ^^

    Merci encore, je vais tester ça ce soir !

    Bonne soirée

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ZeNoob Voir le message
    Et puis avec une clé de type Integer ça ne marchait pas non plus, pourtant je ne dois pas être obligé de redéfinir hashCode dans ce cas.
    Salut,

    Il n'y a pas de raison pour que cela ne fonctionne pas avec des clefs de type Integer : justement l'implémentation de cette classe respecte le contrat de equals() et hashCode(), et la classe étant immuable, elle est particulièrement adaptée pour être utilisée comme clef dans une Map. Je ne sais pas trop ce que tu as fait pour que cela ne fonctionne pas .
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut
    Merci ça marche impeccable, j'aurais du m'en douter un peu quand même vu que dans les STL c'est pareil faut redéfinir les relations d'ordre mais en Java j'ai le cerveau au ralenti

    Sinon pour les clés de type entier oui j'ai sûrement déconné ailleurs parce que ça doit marcher tout seul.

    Merci beaucoup à vous !

    Nota. la prochaine bien lire la FAQ avant de poser des questions triviales.

Discussions similaires

  1. [IBATIS/mysql] problème de mapping
    Par iftolotfi dans le forum Persistance des données
    Réponses: 3
    Dernier message: 07/07/2006, 10h40
  2. [Débutant] Problème de mapping des ports
    Par zehle dans le forum VHDL
    Réponses: 1
    Dernier message: 22/05/2006, 22h37
  3. [PERL] Problème avec map
    Par LE NEINDRE dans le forum Langage
    Réponses: 9
    Dernier message: 05/10/2005, 09h48
  4. [CASTOR]Problème de mapping de données
    Par chuck norris dans le forum Persistance des données
    Réponses: 1
    Dernier message: 13/07/2005, 22h01
  5. [Struts] Problème de mapping
    Par ArseNic dans le forum Struts 1
    Réponses: 5
    Dernier message: 10/02/2005, 10h11

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