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 :

Question sur les HashMaps


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
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut Question sur les HashMaps
    Bonjour, j'aurais quelques questions à propos des HashMaps pour les connaisseurs.

    Est-il possible d'arrêter de parcourir une boucle avec EntrySet ?

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for ( Map.Entry<Integer,String> entry : maMap.entrySet()){
           if ( entry.getValue().equal("test"){
                   fonctionX.doSomething();
                   entry.end();
           }
    }
    Autre question.
    Les HasMaps sont-il nécessairement triés dans un ordre de construction comme dans un ArrayList ou (comme j'ai l'impression), leur ordre peut varier de façon aléatoire ou autre ?

  2. #2
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par mazertys17 Voir le message
    Est-il possible d'arrêter de parcourir une boucle avec EntrySet ?

    Oui, par exemple comme tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for ( Map.Entry<Integer,String> entry : maMap.entrySet()){
           if ( entry.getValue().equal("test"){
                   fonctionX.doSomething();
                   entry.end();
           }
    }
    sauf entry.end() qui n'exsite pas (la clef s'obtient par getKey() par ailleurs) (et puis c'est equals() pas equal())

    Tu peux également utiliser les streams, puisque l'entryset est un Set (maMap.entrySet().stream()...
    Citation Envoyé par mazertys17 Voir le message
    Autre question.
    Les HasMaps sont-il nécessairement triés dans un ordre de construction comme dans un ArrayList ou (comme j'ai l'impression), leur ordre peut varier de façon aléatoire ou autre ?
    Non, en effet, l'ordre de parcours ne correspond pas à l'ordre d'insertion avec une HashMap. Il dépend des tables de hashage, donc de la répartition des hashcodes des clefs : autant dire qu'on ne peut le prendre en compte. Tu peux néanmoins obtenir ce comportement en utilisant une LinkedHashMap.
    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.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Merci Joel Drigo,

    Mais pourrais tu être plus précis sur le code pour finir la boucle ?
    Je n'ai pas trouvé de fonction " entry.getKey().end() "

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    La boucle se finit d'elle-même lorsque on a itéré sur l'ensemble des entries. C'est le principe d'un itérateur... (un forEach utilise un itérateur).

    Pourquoi vouloir appeler une hypothétique méthode getEnd() ? Tu as besoin de faire un traitement spécial sur la dernière entrée ?
    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
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pour arrêter une boucle on utilise tout simplement un break :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ( Map.Entry<Integer,String> entry : maMap.entrySet()){
           if ( entry.getValue().equal("test"){
                   fonctionX.doSomething();
                   break;
           }
    }

    a++

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Merci !

    Je vais essayer cela.

    C'est simplement pour éviter de parcourir le reste d'une boucle pour rien quand l'élément a été trouvé et d'autre part, s'il y a un traitement qui doit être appliqué avec une donnée présente dans des clefs différentes et ne doit l'être qu'une fois, il est nécessaire d'arrêter de parcourir la boucle pour empêcher que ce traitement soit fait plusieurs fois.
    On peut mettre un système de condition mais c'est lourd, aussi bien dans le code que dans les performances sans doute.

    Donc merci, je vais voir avec un break.
    Jusqu'à maintenant, je procédais avec des Iterators, mais j'ai quelques plantages qui y sont sans doute liés :

    Une autre question bête.
    Comment fait-on pour avoir accès simplement a une donnée d'un HasMap sans avoir a parcourir systématiquement la boucle ?

    Si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
                    val1 = maMap.get(17).value1 ;
                    val2 = maMap.get(17).value2 ;
                    ect...
    il parcour 2 fois la boucle non?

    Comment faire l'équivalent de ca par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    Set key = (Set)maMap.get(17);
                    val1 = key.getValue().value1 ;
                    val2 = key.getValue().value2 ;
                    ect...

Discussions similaires

  1. Question sur les HashMap
    Par rahma2 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 20/10/2014, 15h57
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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