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 :

Union deux HashMap


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut Union deux HashMap
    Bonjour à tous,

    J'aimerai savoir est ce qu'il existe une fonctionnalité pour faire l'union de deux HashMap sans pour autant parcourir tout le HashMap avec un iterator et ajouter valeur par valeur!
    j'ai essayer ce programme :

    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
    HashMap<Integer, Set<Character>> setA; 
           HashMap<Integer, Set<Character>> setB; 
           setA = new HashMap<Integer, Set<Character>>();
           setB = new HashMap<Integer, Set<Character>>();
           
           Set s1 = new HashSet();
           Set s2 = new HashSet();
           
           s1.add('a');s1.add('b');s1.add('y');
           s2.add('c');s2.add('d');s2.add('z');
           setA.put(1, s1);
           setB.put(2, s2);
           System.out.println(setA.get(1));
           System.out.println(setB.get(2));
           
           setA.putAll(setB); //il remplace tout le contenu et pas l'union
           System.out.println(setA.get(1));
    à la fin du programme je veux que le HashMap setA contient ses valeurs + les valeurs du HashMap setB, alors que putAll ne fait que remplacer

    y'aura t'il une autre solution ? ou je dois ajouter valeur par valeur en utilisant un Iterator ?


    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184

  3. #3
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Une petite remarque : tu devrais nommer mapA plutôt que setA, vu que c'est, justement, une Map (et pas un Set).

    Et sinon, je t'assure que putAll ajoute tous les éléments de la map utilisée.
    Donc ici ça rajoute 2 => s2.

    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
     
    		HashMap<Integer, Set<Character>> setA; 
    	    HashMap<Integer, Set<Character>> setB; 
    	    setA = new HashMap<Integer, Set<Character>>();
    	    setB = new HashMap<Integer, Set<Character>>();
     
    	    Set<Character> s1 = new HashSet<Character>();
    	    Set<Character> s2 = new HashSet<Character>();
     
    	    s1.add('a');s1.add('b');s1.add('y');
    	    s2.add('c');s2.add('d');s2.add('z');
    	    setA.put(1, s1);
    	    setB.put(2, s2);
    	    System.out.println(setA.get(1));
    	    System.out.println(setB.get(2));
     
    	    setA.putAll(setB); //il remplace tout le contenu et pas l'union => non !
    	    System.out.println(setA.get(1));
    	    System.out.println(setA.get(2));
    Retour :
    [b, a, y]
    [d, c, z]
    [b, a, y]
    [d, c, z]

    Maintenant si tu veux ajouter le contenu de s2 à celui de s1, c'est complètement différent ... Là en effet tu n'auras pas d'autre choix que de parcourir les valeurs de ta map pour faire un opération annexe, en l'occurence une boucle for accompagnée de choses du genre s1.addAll(s2).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut
    Merci pour votre réponse. En fait, je veux ajouter les éléments de s2 à s1, donc d'après ce que vous avez dit, c'est addAll. Parcontre, La fonctionnalité addAll n'existe pas dans les HashMap, il y a que putAll !
    et si j'ajoute les keyset et les values séparament, cela m'affiche une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     MapA.keySet.addAll(MapB.keySet()); 
     MapA.values().addAll(MapB.values());
    comment je peux appliquer addAll sur les HashMap ?

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    C'est ce que j'indique plus haut (j'ai cependant édité pour être plus clair ^^) : dans ce cas là, il n'y a effectivement pas d'autre choix que de faire un parcours et de faire addAll set à set ... Tu as vraiment un besoin particulier qui ne correspond pas à ce qu'on attend du comportement basique d'une map. Cela dit, ça tient en une petite boucle for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (Integer i : setB.keySet()) {
    	if (setA.get(i) == null) {
    		setA.put(i,setB.get(i));
    	} else {
    		setA.get(i).addAll(setB.get(i));
    	}
    }

  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 : 45
    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
    petite remarque, pour itérer sur une HashMap, il est recommandé de faire l'intération sur l'entrySet et non pas sur le keySet, ça évite la création de Collections inutiles.

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    petite remarque, pour itérer sur une HashMap, il est recommandé de faire l'intération sur l'entrySet et non pas sur le keySet, ça évite la création de Collections inutiles.
    Vraiment ? Je vois bien que ça évite de faire un lookup inutile de la clé, mais je me rendais pas compte que ça faisait moins de collections.
    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. Supprimer les doublons de deux HashMaps
    Par wilddances dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 27/03/2013, 13h31
  2. Comparaison de deux HashMap
    Par Marvin217 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 10/03/2011, 19h30
  3. faire l'union deux listes
    Par ulysse031 dans le forum Langage
    Réponses: 34
    Dernier message: 06/06/2007, 10h55
  4. UNION de deux SELECT avec nombre d'arguments différents
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2004, 14h32
  5. [Débutant] Union de deux tables
    Par nyarla01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/03/2004, 10h40

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