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 :

HashMap et IdentityHashMap


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut HashMap et IdentityHashMap
    Bonjour,

    Etant nouveau ici, je ne sais pas si je post au bon endroit mais au pire, je me ferais taper sur les doigts

    J'ai créé une fonction qui permet de décoder et découper une string base64 vers de l'hexa.
    Je récupère la structure du message dans un fichier XML.

    Je range les infos que j'obtiens au fur et à mesure dans une IdentityHashMap:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(...)
    {
      String key = ...;
      String value = ...;
      maMap.put(key,value);
    }
    Lorsque j'affiche cette map, elle contient les 7 éléments que je désire.
    Là où ça coince, c'est que la méthode map.get("maClef") me renvoie "null" et map.containsKey("maClef") me renvoie "FAUX".

    Là où ça devient fort, c'est que si dans la méthode de décodage/découpage je remplace par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(...)
    {
      String key = ...;
      String value = ...;
      if(key.compareTo("maClef") == 0)
      {
         maMap.put("maClef", value);
      }
      else
      {
        maMap.put(key,value);
      }
    }
    A ce moment là, la méthode map.get("maClef") me renvoie la valeur associée et map.containsKey("maClef") me renvoie "VRAI".

    La blague c'est que ce problème n’apparaît pas pour toutes les clefs.
    Quelqu'un aurait une idée sur le soucis?

    Je précise que j'ai fait les tests avec des méthodes comme compareTo(), matches() ou encore equals() pour vérifier que les chaines étaient bien identiques et que j'ai essayé de changer la longueur de la chaîne valeur des fois qu'elle soit trop grande.

    Merci par avance

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut
    J'ai oublié de préciser que j'étais sur NetBeans 7.1.2 avec JDK 1.6

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Je vois au moins 3 raisons possibles:
    1 - La conversion a ajouté des caracteres (par exemple des espaces) et tes chaines sont différentes.
    2 - Probleme d'encodage
    3 - Tu utilises une IdentityHashMap et les objets String créés sont différents (meme si égaux)

    Le 1 et 2 devraient pouvoir se voir au debugger. Pour le point 3, il faudrait utiliser une HashMap pour voir si le probleme existe toujours (ou bien vérifier au debugger que les id des String sensés etre égaux sont les meme)

    Question complémentaire : Pourquoi utilises tu une IdentityHashMap ?

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut
    Merci pour la réponse express

    1) Il n'y a que les valeurs qui sont décodées. Les clefs sont directement récupérées en String dans le fichier XML. Ce dernier contient les noms des variables, les types (ex: CHAR8) et le nombre d’occurrence du type.
    Ex: <> name="maClef" type="UINT32" size="2" </>
    Cela veut dire que maClef représente 8*2 caractères hexa dans la chaine.

    2) Peux-tu préciser? Par défaut NetBeans est en UTF-8

    3) Les objets key et value sont déclarés en tête de méthode et sont simplement modifiés dans la boucle.

    complémentaire) Dans certains cas, je peux avoir plusieurs clefs identiques (mais pas celle qui me pose problème ici)

  5. #5
    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
    tu utilise une IdentityHashMap, donc c'est l'instance de la String qui importe et non son contenu, d'où ton problème. Grosso modo, une identity hashmap n'est utilisable que si tu stocke aussi ailleurs les clés et que tu utilise ces clés stockées pour accéder à la map.

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut
    Je vois le soucis.
    Les méthodes comparent vraiment les objets passés en paramètres et non les contenus.

    Merci beaucoup.

    Il y a un équivalent de map à clef multiple qui n'aurait pas ce genre d’inconvénient?

  7. #7
    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
    Non, mais dans 99.9% des cas, cette Structure faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String,List<String>>

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Août 2012
    Messages : 6
    Par défaut
    Très bien.
    Merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [eclipse] HashMap et methode put
    Par topaze dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/01/2005, 16h37
  2. Ranger un tableau de String dans ma HashMap
    Par jeyce dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 26/08/2004, 22h41
  3. [HashMap] Modification d'objet d'une Hashtable
    Par viena dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 29/07/2004, 09h04
  4. Surcharge de l'égalité et HashMap
    Par olivierM dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 10/06/2004, 09h54
  5. [débutant] cherche a copier une HashMap
    Par mathieublanc13 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 09/05/2004, 14h33

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