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 :

Suppression d'éléments dans une map


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Suppression d'éléments dans une map
    Bonjour,
    J'ai une question concernant les HashMap, plus particulièrement les map.

    J'initialise au départ une map "map" avec 6 éléments et des valeurs d'objets Voiture à null.

    puis j'appelle cette méthode


    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
      public Set<String> getEntries() {
        Map<String, Voiture> mapCopie = new HashMap<String, Voiture>();
        mapCopie.putAll(map);
        Iterator<String> iterator = mapCopie.keySet().iterator();
     
        while (iterator.hasNext()) {
          System.out.println("iterateur " + iterator.next().toString());
     
          if (mapCopie.get(iterator) == null) {
            mapCopie.remove(iterator);
          }
     
          System.out.println(mapCopie);
          System.out.println("");
        }
     
        return mapCopie.keySet();
      }
    j'ai autant d'éléments après l'appel. pourtant j'aimerais que la map soit vide. Ou est mon erreur ? merci de votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 181
    Points
    181
    Par défaut suppression d'éléments dans une map
    Salut.

    Et bien je l'ai fait l'autre jour,

    tu fais simplement macopie.clear(); pour vider ta map.


  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    En fait je ne veux pas tout vider systématiquement. Je fais le tri avec la condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mapCopie.get(iterator) == null)
    Au départ toutes les valeurs sont nulles donc la map devrait être vide mais ensuite je la remplis avec ceratines valeurs non null.

    Le clear() efface toute la map et ce n'est pas ce que je voudrais...

  4. #4
    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
    Salut,

    @patril, ton erreur vient du fait que l'iterateurr ne sert qu'à itérer (sur les clefs, puisqu'il est obtenu à partir du keyset) : il n'est pas, et ne représente pas non plus, une clef dans la map.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Iterator<String> iterator = mapCopie.keySet().iterator();
     
    while (iterator.hasNext()) {
       System.out.println("iterateur " + iterator.next().toString());
     
       if (mapCopie.get(iterator) == null) {
          mapCopie.remove(iterator);
       }
    }
    Pour récupérer l'élément courant, on appelle next() : attention, cette méthode consomme l'élément, ce qui signifie que le next() suivant récupérera l'élément suivant, ou, au pire, soulèvera une exception NuSuchElementException (plus d'élément...).
    Ensuite, il ne faut jamais (sauf exception d'implémentation prévue pour) modifier le nombre d'éléments d'une collection sur laquelle on itère, sauf par la méthode remove() de Iterator. Tu obtiendras une ConcurrentModificationException.

    Donc le code équivalent qui fonctionne est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Iterator<String> iterator = mapCopie.keySet().iterator();
     
    while (iterator.hasNext()) {
       String key = iterator.next();
       System.out.println("iterateur " + key);
     
       if (mapCopie.get(key ) == null) {
          iterator.remove(); // Note bien ici sur quelle instance on appelle remove()
       }
    }
    Remarque que si tu n'as pas besoin d'afficher, tu pourras faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Iterator<String> iterator = mapCopie.keySet().iterator();
     
    while (iterator.hasNext()) { 
     
       if (mapCopie.get(iterator.next()) == null) {
          iterator.remove(); // Note bien ici sur quelle instance on appelle remove()
       }
    }
    Enfin, lorsqu'on parcourt les clefs d'une map dans le but d'exploiter les valeurs mappées, il est bien plus efficace de parcourir l'entrySet que le keySet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(Iterator<Map.Entry<String,String>> iterator = mapCopie.entrySet().iterator(); iterator.hasNext();) { // le for est préférable au while, pour limiter le scope de la variable iterator
       if ( iterator.next().getValue()==null ) {
          iterator.remove();
       }
    }
    On peut encore faire plus simple, puisque ton code n'exploite que la valeur (et non la clef), en itérant sur les valeurs directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(Iterator<String> iterator = mapCopie.values().iterator(); iterator.hasNext();) {
       if ( iterator.next()==null ) {
          iterator.remove();
       }
    }
    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.

  5. #5
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    juste parce que j'ai vu la porte ouverte....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(Iterator<String> iterator = mapCopie.values().iterator(); iterator.hasNext();) {
       if ( iterator.next()==null ) {
          iterator.remove();
       }
    }
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mapCopie.values().removeAll(Collections.singleton(null));

  6. #6
    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
    Ou peut-être simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mapCopie.values().removeIf(e -> e == null);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Boucle de suppression d'éléments d'une Map
    Par olive_le_malin dans le forum C++
    Réponses: 19
    Dernier message: 28/10/2013, 16h20
  2. Réponses: 2
    Dernier message: 18/04/2010, 11h15
  3. Existence d'un élément dans une map
    Par magicpm7 dans le forum SL & STL
    Réponses: 6
    Dernier message: 20/08/2007, 17h37
  4. pb de suppression d'éléments avec une map
    Par pada51 dans le forum SL & STL
    Réponses: 2
    Dernier message: 08/08/2007, 14h36
  5. Suppression d' éléments dans une liste.
    Par conan76 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/03/2007, 09h33

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