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 :

Problème de LinkedHashMap + ordre d'insertion


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut Problème de LinkedHashMap + ordre d'insertion
    Bonjour,

    J'ai un problème concernant ma LinkedHashMap.

    Je l'utilise car j'ai besoin de gardé l'ordre d'insertion mais le problème est que celle ci ne me le garde pas.

    Je m'explique, j'ai une LinkedHashMap<MyClass, Integer>. (MyClass étant une classe que j'ai créé).

    Cependant, lorsque j'insère un élément et que je regarde à l'aide du debugger d'Eclipse, je m'aperçois que celui ci est inséré aléatoirement.

    Et je remarque aussi que ma table correspond à une HashMap. Normal?


    Une explication ? Une solution ?

  2. #2
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Salut,

    Personnellement, dans mes DAO je declare

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     private static Map<String, Animals> animalsMap = new LinkedHashMap<String, Animals>();

    Dans mon managedBean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private Map<String, Animals> animalsMap;
    animalsMap = new AnimalsFacade().map();
    for (int i = 0; i < listAnimals.size(); i++) {
    animalsMap.put("" + listAnimals.get(i).getId(), listAnimals.get(i));
    ...}
    Avec ceci tout reste dans l'ordre croissant de ma bdd

    J'espere que ceci t'aura aider.

    Sinon soit plus precis avec des bouts de codes ou autres

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    Merci de ton aide.

    Voici un exemple de mon utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private Map<MyClass, Integer> myMap = new LinkedHashMap<MyClass, Integer>();
     
    myMap.put(new MyClass("ok"), 1);
    Et là le problème est que mon insertion n'est pas ajouté au premier élément de ma map.

    J'ai fait un test en inversant MyClass et Integer et j'ai pu m'apercevoir qui lorsque je mettais par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myMap.put(1, new MyClass("ok"));
    Cela s'insère à la case 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myMap.put(5, new MyClass("ok"));
    Cela s'insère à la case 5.

    Il ne mets donc pas mes éléments en ordre d'insertion.

  4. #4
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Voici qui pourrait peut etre t'aider

    Lien

    Si ceci ne le permet fais nous signe

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    Je vais regarder le lien (que j'ai déjà regardé en diagonale) mais il est a noté que moi je ne veux pas effectuer de tri selon certains critères mais juste garder l'ordre d'insertion.

    Et ce qui est étrange c'est que la LinkedHashMap est censé me garder cette ordre d'insertion peu importe le type de la clé. Mais peut être que cet ordre d'insertion ne commence par forcément à l'indice 0 du tableau, puis 1, etc ?

  6. #6
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Je viens de faire un test et voici mon resultat


  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    J'ai déjà test ce code que j'avais trouvé mais cela ne teste pas très bien car de toute manière on utilise en clé des Integer que l'on ajoute dans l'ordre 0, puis 1, puis 2, etc...

    Donc c'est comme si on indiqué l'indice avec la clé Integer. Ici ma clé est un objet. Je vais effectuer d'autre test pour voir mais je trouve quand même bizarre qu'il ne me garde pas l'ordre d'insertion même si la clé est un objet.

  8. #8
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Une petite correction sur le fait qu'un String est un objet

  9. #9
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    Oui bien entendu, je n'ai pas dis le contraire. Je parle de la clé.

    Mise à part, j'ai effectué quelque test avec donc comme j'ai dis précédemment, un objet en tant que clé (autre que Integer) et apparemment, dans la table HashMap lié à la LinkedList, l'insertion n'est pas faîte dans l'ordre, mais pour l'affichage cela l'affiche dans l'ordre. Il doit certainement effectuer un calcul du hashcode ou autre pour placer l'élément et le retrouver dans l'ordre par la suite.

    Si quelqu'un a une idée sur la manière de pouvoir avoir un objet en clé et un Integer en valeur en gardant l'ordre d'insertion en partant de l'indice 0 et en incrément de 1 en 1 l'indice. Une sorte d'ArrayList pouvoir avec une association clé/valeur.

    J'ai oublié de préciser que j'ai besoin que l'indice soit gardé car j'utilise cette "map" en tant que données de mon modèle (MVC) et que la méthode getElementAt de ma DefaultList doit me retourner le bon élément selon l'indice de ma JList.

  10. #10
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    J'ai testé cette fois ci uniquement comme tu souhaitais.

    Voici ma partie debug ou tu vois se que possede ma variable ( par les adresses des objets ) sur la droite:


    Et voici sa sortie output :

  11. #11
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    Oui mais la tu affiches simplement le Sysout donc forcément on les voit dans l'ordre. C'est de même pour moi. Mais si tu mets un point de debug et que tu vas regarder dans la HashMap de la LinkedList, tu t'apercevras que les insertions ne se font pas indice par indice en partant de 0.

    Pour exemple:


    Sinon peux tu mettre ton code en pièce jointe que je le test?

    Merci encore pour ton aide

  12. #12
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    J'ai fais un debug aussi.

    Sur la droite du premier screen, tu peux voir se qu'il contient.

    Ensuite, dans le deuxieme screen, j'ai fais un sysout pour voir la sortie.

    Et autant dedans quand sortie, l'ordre pour ma part est de meme donc je pense que ca vient d'ailleurs.

  13. #13
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    L'ordre d'insertion pour ma part est aussi la même, sauf qu'elle ne commence pas à l'indice 0, puis 1, puis 2, etc...

    Serait-il possible d'avoir ton code car je viens de ré-écrire exactement la même chose et je constate encore que la HashMap de ma LinkedHashMap a toujours ses éléments ne commencant pas par l'indice 0.

    De plus, je ne vois pas dans ton screen la HashMap de ta LinkedHashMap mais simplement ta LinkedHashMap car tu ne vas pas voir assez profondement dans otn debut. Si je n'affiche que ce que tu affiches dans ton debug moi aussi, j'ai la même chose que toi. Il faut que tu debug plus en profondeur pour voir la structure.

  14. #14
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Je crois qu'il y a quelques points que tu n'as pas mis.

    Plus haut, tu fais apparaitre que ta linkedhashmap.

    Tout autant, celle ci herite de la hashmap donc apres il faut que tu me dise se que tu as exactement dans ton code.

    J'ai fait les tests avec les sources que tu m'avais donné ( qui ne laisse pas apparaitre de hashmap ).

  15. #15
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    Voici un Main dans lequel je fais des tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Main {
     
    	public static void main(String[] args) {
    		Map<MyClass, Integer> mymap = new LinkedHashMap<MyClass, Integer>();
    		mymap.put(new MyClass("Test", null), 6);
    		mymap.put(new MyClass("Retest", new Object[]{4, 0.2f}), 5);
    		mymap.put(new MyClass("retest1", new Object[]{1, 0.2f}), 10);
     
    		System.out.println(mymap);
    	}
    }
    Même si je vois bien que mon Syso affiche les données dans l'ordre, quand je vais dans le debug en profondeur, je vois dans la structure le screen que j'ai mis précédemment avec la HashMap contenant les LinkedHashMap.

    A noter que j'ai testé aussi sur 2 autres pcs (par désespoir ) mais c'est exactement la même chose.

  16. #16
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Je te mets avec le detail sur le code d'origine que j'ai et qui m'affiche toujours dans l'ordre.




    Je vais tester ton code

  17. #17
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Voici l'evaluation de mymap :


    Et voici sa sortie :



    Arf, desole mais pour moi tout fonctionne

  18. #18
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    Oui moi aussi il me l'affiche dans l'ordre. C'est le ToString() qui permet cela donc même dans ton debug c'est le debug du ToString() qui est affiché et c'est normal qu'il soit dans l'ordre. Pour moi aussi.

    Il faudrait que tu ailles plus en profondeur pour constater que le stockage (qui n'est pas celui du ToString) est en fait une HashMap faisant un hachage je pense pour placer les éléments à un indice précis et ainsi refaire un hachage lors du toString.

  19. #19
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 284
    Par défaut
    Arf, bizarre, bizarre... je ne comprends plus alors... Je ne pense pas mal utiliser la HashMap pourtant. C'est quoi ton logiciel de debug ?

  20. #20
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    J'utilise netbeans.

    Tu utilises eclipse ?

Discussions similaires

  1. Problème avec l'ordre d'insertion des lignes avec BULK INSERT
    Par TomtomGesti dans le forum Développement
    Réponses: 3
    Dernier message: 18/07/2014, 16h50
  2. collection avec l'ordre d'insertion
    Par keopsk dans le forum Langage
    Réponses: 3
    Dernier message: 28/05/2006, 20h13
  3. [Collections]Garder l'ordre d'insertion
    Par Leyne dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 13/12/2005, 19h25
  4. Syntaxe tableaux dans ordre SQL INSERT
    Par lio33 dans le forum SQL
    Réponses: 6
    Dernier message: 19/10/2005, 17h07
  5. Réponses: 11
    Dernier message: 17/01/2005, 16h58

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