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 :

Probleme d'ajout dans une map


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 179
    Points : 50
    Points
    50
    Par défaut Probleme d'ajout dans une map
    Bonjour,

    j'ai écrit différentes méthodes pour gérer une 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    import java.util.*;
     
    public class TestMap {
        private Map<Couple, List<String>> map;
     
        public TestMap(){
    	map = new HashMap<Couple, List<String>>();
    	//Rempli la map
    	rempli_map();
        }
     
        void afficheMap(){
    	//iterateur sur la map
    	Iterator it = getMap().entrySet().iterator();
    	while (it.hasNext()){
    	    Map.Entry pairs = (Map.Entry)it.next();
    	    Couple couple = (Couple)pairs.getKey();
    	    System.out.print(couple.getString() + " " + couple.getInt() + " : ");
    	    List<String> liste = (List<String>)pairs.getValue();
    	    for(int i=0; i<liste.size(); i++)
    		System.out.print(liste.get(i) + " ");
    	    System.out.println("");
    	}
        }
     
        void setMap(Couple couple, List<String>liste){
    	map.put(couple,liste);
        }
     
        Map<Couple, List<String>> getMap(){
    	return map;
        }
     
        //recherche si le mot donne en parametre est dans la map
        Couple recherche_map(String mot){
    	//iterateur sur la map
    	Iterator it = getMap().entrySet().iterator();
    	while (it.hasNext()){
    	    Map.Entry pairs = (Map.Entry)it.next();
    	    Couple couple = (Couple)pairs.getKey();
    	    List<String> liste = (List<String>)pairs.getValue();
    	    for(int i=0; i<liste.size(); i++)
    		if(liste.get(i).equals(mot))//on a trouve le mot
    		    return couple;//on retourne le couple correspondant
    	}
    	return null;//le mot n'est pas present
        }
     
        //rempli la map
        public void rempli_map(){
    	Couple couple1 = new Couple("couple1",10);
    	List<String> liste1 = new ArrayList<String>();
    	liste1.add("un");
    	liste1.add("deux");
    	liste1.add("trois");
    	setMap(couple1,liste1);
     
    	Couple couple2 = new Couple("couple2",20);
    	List<String> liste2 = new ArrayList<String>();
    	liste2.add("quatre");
    	liste2.add("cinq");
    	liste2.add("six");
    	setMap(couple2,liste2);
        }
     
        //ajoute un mot au couple donne en parametre
        boolean ajouteMot(Couple couple, String mot){
    	boolean found = false;
    	if(getMap().containsKey(couple)){
    	    List<String> liste = getMap().get(couple);
    	    liste.add(mot);
    	    setMap(couple, liste);
    	    found = true;
    	}
    	return found;
        }
     
     
        public static void main(String [] args){
    	TestMap map = new TestMap();
    	map.afficheMap();
    	Couple couple = map.recherche_map("un");
    	if(couple != null){
    	    System.out.println("le couple qui gere le mot 'un' est : " + couple.getString() + " " + couple.getInt());
    	}
     
    	Couple c = new Couple("couple1",10);
    	boolean found = map.ajouteMot(c, "neuf");
    	if(found){
    	    System.out.println("le mot 'neuf' a ete ajoute a la map");
    	}
    	else{
    	    System.out.println("le mot 'neuf' n'a pas ete ajoute car le couple '(couple1,10)' n'est pas dans 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
     
    //Couple.java
    public class Couple{
        private String s;
        private Integer val;
     
        public Couple(String s, Integer val){
    	this.s = s;
    	this.val = val;
        }
     
        public String getString(){
    	return s;
        }
     
        public Integer getInt(){
    	return val;
        }
    }
    A l'execution du programme, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    java TestMap
    couple1 10 : un deux trois
    couple2 20 : quatre cinq six
    le couple qui gere le mot 'un' est : couple1 10
    le mot 'neuf' n'a pas ete ajoute car le couple '(couple1,10)' n'est pas dans la map
    Je ne comprends pas pourquoi le mot "neuf" n'est pas ajouté à la map alors que le couple est présent.

    La méthode qui pose proiblème est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //ajoute un mot au couple donne en parametre
        boolean ajouteMot(Couple couple, String mot){
    	boolean found = false;
    	if(getMap().containsKey(couple)){
    	    List<String> liste = getMap().get(couple);
    	    liste.add(mot);
    	    setMap(couple, liste);
    	    found = true;
    	}
    	return found;
        }

  2. #2
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    En speed parceque j'ai une reunion,

    L'objet couple("couple1",10) (le deuxieme que tu cré) n'est pas dans la map.
    En effet la clé d'une Map est un hash d'un objet et deux objet meme si il on le meme contenu n'on pas le meme hash

    J'espere avoir été assez clair...

  3. #3
    Membre actif Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Points : 294
    Points
    294
    Par défaut
    Simple, l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Couple c = new Couple("couple1",10);
    que tu créés dans rempli_map est détruit à la fin du block, donc ce n'est pas le même que celui que tu reconstruis pour faire ta recherche dans le main



    Hope it helps !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 179
    Points : 50
    Points
    50
    Par défaut
    Ok mais je ne vois pas très bien comment faire pour ajouter un mot autrement.
    Quelqu'un pourrait-il m'indiquer ça.

    Merci

  5. #5
    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,


    Il faut que ta classe implémente correctement les méthodes equals() et hashCode()...


    a++

  6. #6
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    Sinon tu peu aussi definir une clé plus simple pour ta MAP qui serait un string par exemple et dans ce cas tu pourra faire la recherche comme tu souhaite le faire car le hashCode sera identique pour deux string identiques.
    (si tu regarde la méthode hashCode() de la class String tu vera que si deux string son identique il auront le meme hashCode)

    Sinon comme le dit AdiGuba implemente les méthodes HashCode() et equal() dans ta class couple de maniere a ce que le HashCode soit identique si les attribut d'un objet de ta class Couple sont identique par exemple.

    Si tu veux plus d'info sur HashCode()...
    http://www.geocities.com/technofundo...equalhash.html


    A mon avis la premiere méthode est plus simple et doit convenir parfaitement a ce que tu souhaite faire... A toi de voir
    ++

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    Salut,
    Quand tu écris :
    il sait par défaut qu'il renvoit un object car tu n'a pas préciser de type 'généric' pour pair (d'ailleurs je ne sais pas si cela est possible ? )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Map.Entry<E> pairs = (Map.Entry<E>)it.next();
    donc pour enlever le warning soit tu précise un type générique (comme j'ai dit je ne sais pas si cela est possible, j'ai pas eclipse d'ouvert et je ne vais pas l'ouvrir lol).
    soit tu laisse ton warning...
    edit : si c'est possible je viens de regarder la doc !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map.Entry<Couple,List<String>> pairs = (Map.Entry<Couple,List<String>>)it.next();

  8. #8
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    Il faut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Iterator<Map.Entry<Couple,List<String>>>

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    bah peut etre qu'il faudrait faire pareil pour Iterator !!!!
    apparement tu n'as pas compris le warning...
    il te dit que tu risque d'avoir un probleme car tu effectues un cast en Map.Entry<Couple,List<String>> alors que lui s'attends à te renvoyer un <Object> par défaut. il te demande donc si cela est normal et une facon de lui dire que c'est normale c'est de définir ta variable appelante de la meme facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iterator<Map.Entry<Couple,List<String>> it = .....
    maintenant que tu as compris, tu ne reposeras pas deux fois la même question

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 179
    Points : 50
    Points
    50
    Par défaut
    Merci. Ca fonctionne nickel

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

Discussions similaires

  1. NullPointerException ajout d'un élément dans une Map
    Par pandora19 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 11/11/2012, 17h45
  2. probleme d'ajout dans une table
    Par diamentelle dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2009, 17h57
  3. Problemes d'ajout dans une JList à partir d'un Jtextfield
    Par elmander dans le forum Général Java
    Réponses: 6
    Dernier message: 26/01/2009, 18h21
  4. Probleme d'ajout d'une date dans un base de donnée access(conversion)
    Par jacko842 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 20/01/2008, 13h27
  5. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 21h28

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