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

Langage Java Discussion :

[HashTable] Problème de fonctionnement


Sujet :

Langage Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut [HashTable] Problème de fonctionnement
    Bonjour,

    J'ai un problème d'exploitation au niveau des HashTable et je ne sais pas si je me trompe ou si c'est son fonctionnement "normal".

    Voila j'ai 2 HashTable A et B.

    Je veux récuperer, à partir d'une cle que je connait, le contenu de A. (qui est un tableau de String). Donc je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String [] tmp = new String [3];
    tmp = (String [])A.get(cle);
    Ensuite je veux changer une valeur du tableau récuperé et l'affecter au tableau B. Donc je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tmp[2]="toto";
    B.put(cle,tmp);
    Seulement quand je fait cela, la valeur change aussi dans A ce que je ne veux pas.

    Mais je sais pas pourquoi j'ai cette réaction.

    Y-a-t-il un problème dans ce bout de code ?

    Merci de votre aide.

  2. #2
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par RR instinct
    Seulement quand je fait cela, la valeur change aussi dans A ce que je ne veux pas.
    C'est normal, ce que contiennes tes 2 Map sont des (simples) références vers un même objet : pas 2 objets différents ; donc si tu changes une valeur pour l'un tu la change pour l'autre... c'est normal !
    Ce qu'il faut faire c'est :
    - soit mettre 2 copies d'objet différent dans chaque Map,
    - soit récupérer l'objet depuis la 1e Map puis le copier et modifier cette copie avant de l'insérer dans la 2e Map.
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tout simplement parce que tu passes le même tableau dans les deux Hashtable, et qu'elle sont passé par copié de référence : Donc tu n'as qu'un seul et unique tableau. Si tu le modifies il sera modifier pour les deux Hashtable...


    D'ailleurs il est inutile d'allouer le tableau puisque tu recois une nouvelle référence depuis la Map. Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String [] tmp = new String [3];
    tmp = (String [])A.get(cle);
    Peut se résumer à ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String [] tmp = (String [])A.get(cle);
    En Java, l'opérateur "=" ne modifie pas la valeur de l'objet, mais bien sa référence (sauf pour les types primitifs bien sûr).

    a++

    [edit] grillé

  4. #4
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour

    Ce comportement est tout à faire normal. Les tableaux sont des objets et sont donc des références.
    Donc tmp est A.get(cle) sont le même tableau.

    [edit] grillé aussi [/edit]

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Une belle réponse synchronisée

    Je m'en doutais bien mais je voulais avoir une confirmation ... et j'en ai eu 3

    Merci à tous les 3 !

    Et donc comment je fait pour récupérer un objet dans le premier, le modifier, et ajouter la modif dans le deuxieme? C'est possible ?

  6. #6
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    bah tu crée un nouveau tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String [] tmp = (String [])A.get(cle);
    String [] tmp2=new String[tmp.length];
     
    for(int i=0;i<tmp.length;i++)
       tmp2[i]=tmp[i];
     
    tmp2[2]="toto";
    B.put(cle,tmp2);
    En gros ca donnerai ca

    Bye bye

    Fred

    edit cf en dessous : arraycopy que diantre, je réinvente la roue ^^
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RR instinct
    Et donc comment je fait pour récupérer un objet dans le premier, le modifier, et ajouter la modif dans le deuxieme? C'est possible ?
    Oui il faut faire une copie du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String[] tmp = (String [])A.get(cle);
    String[] copy = new String[tmp.length];
    System.arraycopy(tmp, 0, copy, 0, temp.length);
    a++

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Suis-je bête, j'étais totalement à l'ouest sur cette question

    Merci beaucoup à tous en tout cas

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mavina
    edit cf en dessous : arraycopy que diantre, je réinvente la roue ^^
    Juste à titre d'info : sur un tableau de petite taille cela n'as pas vraiment d'importance (mis à part le fait de réinventer la roue). Mais sur un grand tableau System.arraycopy() peut se revéler nettement plus performant, car il s'agit d'une méthode native qui peut faire une copie d'un bloc de tout le tableau, au lieu de faire n copies de 1 élément...

    a+

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

Discussions similaires

  1. Problème de fonctionnement du logiciel Matlab
    Par badman_nx dans le forum MATLAB
    Réponses: 6
    Dernier message: 17/04/2007, 14h19
  2. Réponses: 5
    Dernier message: 16/12/2006, 12h24
  3. Problème de fonctionnement du Canvas
    Par Julien_C++ dans le forum C++Builder
    Réponses: 18
    Dernier message: 27/07/2006, 10h06
  4. Datecalc : problème de fonctionnement
    Par mollux dans le forum Modules
    Réponses: 2
    Dernier message: 07/06/2006, 08h59
  5. [Tomcat] Problème de fonctionnement de Tomcat sous linux
    Par lautux dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 18/03/2006, 10h30

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