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

  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 : 56
    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 : 56
    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...

  7. #7
    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 : 56
    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
    Ah, oui, je n'avais pas compris le sens de la question pour le break
    Citation Envoyé par mazertys17 Voir le message
    Merci !
    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?
    On accède simplement à la valeur par la méthode get( laclef ) :
    Il n'y a pas de boucle dans ton extrait de code. Il n'y a donc aucun parcours de boucle explicite. Après, si tu parles de ce qui se passe en interne à la HashMap, c'est un autre problème.


    Citation Envoyé par mazertys17 Voir le message
    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...
    Il n'y a pas d'équivalent de ça : la map est déclarée Map<Integer,String>, caster la valeur en Set provoque donc un ClassCastException. Je ne vois même pas ce que tu cherches à faire.
    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.

  8. #8
    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
    Ok, merci.

    Non c'était plutôt pour savoir s'il y avait un moyen de limiter les boucles implicites.
    J'essaye surtout de comprendre un peu mieux comment ça marche, à mon niveau.

    Une autre question niveau mémoire en Java.
    Quand on crée un objet dans un autre objet et qu'on le met dans une HashMap par exemple, il met un pointeur sauf erreur.
    Mais l'objet va-t-il, dans la compilation, être placé au bon endroit dans la HashMap ?

    En somme, il y a t-il une différence entre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Object obj = new Object("test", 8, 1.5 ) ;
    maMap.put(4,obj );
    et ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maMap.put(4, new Object("test", 8, 1.5 ) );
    (Sachant qu'on va utiliser que cette HashMap pour avoir accès a l'objet).

  9. #9
    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 : 46
    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
    les pointeurs ça n'existe pas en java, on parle de référence.

    Tes deux codes sont fonctionellement équivalent. La différence c'est que dans le premier t'aura une variable en plus

  10. #10
    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
    "fonctionnellement", oui...Mais en terme de mémoire, est-ce strictement la même chose ?
    ( a part le fait qu'il y a une variable en plus ).

    Je veux dire par là...seront-ils mis au même emplacement mémoire ?

    J'essaye de construire mon programme sur un modèle d'Entity Composant Système / Data Driven, donc l'idée est de poser les données correspondantes les unes a côtés des autres pour plus de performance lors de leur utilisation.

  11. #11
    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 : 46
    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
    ouais ben en java tu oublie, la jvm se charge d'optimiser ce qui doit l'être et l'emplacement mémoire n'est pas sous ton controle. Et on n'est pas comme en C++ où il y a une différence entre les objets créés par malloc et les objets statique. Dans tes deux exemple, java va allouer un objet et mettre sa référence dans la hashmap.

  12. #12
    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
    Ok.
    Merci.

  13. #13
    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
    Autre question s.v.p niveau perfs.

    Est-il mieux de créer des variables ou containers (type HashMaps ou ArrayList par ex) dans un object ( donc la mémoire sauf erreur ) ou a la volée ?

    ex :
    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
     
     
    class Object {
     
        ArrayList<Bidul> array;  
     
    Object(){
       array = new ArrayList<Bidul>();
    }
    fonction utilisation(){
    array.clear() ;
    for( Bidul b : bidul){
           if (b.truck()){
                array.add(b)
           }
    }

    ou au contraire simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fonction utilisation(){
    ArrayList array = new ArrayList<Bidul>();
    for( Bidul b : bidul){
           if (b.truck()){
                array.add(b)
           }
    }
    C'est sans doute de l'ordre du détail mais c'est surtout pour comprendre mieux .

  14. #14
    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 : 46
    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
    ben ça dépend, dans le premier cas, ton ArrayList est un champ de l'objet, il vit avec l'objet, perdure d'un appel à un autre. Dans le second cas, tu as créé une instance temporaire que tu jette après usage. Ca dépend de ce que tu as besoin. Ce que tu n'a pas besoin de conserver après l'appel de méthode n'a rien à faire dans les champs, c'est local à la méthode.

    Ca ne change pas a priori l'emplacement mémoire où il est instancicé.

  15. #15
    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
    Citation Envoyé par mazertys17 Voir le message
    Autre question s.v.p niveau perfs.
    La GROSSE erreur c'est de penser performance à ce niveau là.
    C'est le meilleur moyen de faire un code tout pourri...


    Le meilleur emplacement pour un variable, c'est là où on en a besoin. Et uniquement là.
    Dans 99% des cas ce sera la meilleure utilisation.


    Dans le 1% des cas restant, lorsqu'on détecte un problème de performance, on aura un code propre à étudier pour déterminer l'origine du problème.


    a++

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