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 :

Modification HashMap


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Par défaut Modification HashMap
    Bonjour à tous,

    J'ai actuellement un probleme concernant un HashMap. Je m'explique.
    J'ai un objet possedant un hashMap "donnees" que je souhaite modifier. Pour cela je créer un Panel avec un Label et un Textfield pour chaque element présent dans mon hashmap. Et lorsque je ferme ce panel, sans appeler de méthodes particulières, mes données dans le HashMap ne devraient pas être modifiées
    J'affiche ensuite à nouveau les données dans le panels mais elles ont été modifié. Je ne comprends pas pourquoi mes données sont modifier alors que je n'ai pas appeler de méthodes.

    Je vous remercie d'avance.

    [EDIT] un petit bout de code tout de meme
    Juste avec panelTempo.Donnees(), mes donnees sont modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    panelTempo.Donnees();
    //elementTempo.Modifier(panelTempo.getDonnees());

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public void Donnees() 
    	{
    		int j = 1;
    		nbGenerique = 3;
    		for (int i = 0; i < listTextField.size(); i++)
    		{
    			if (i < nbGenerique)
    			{
    				if (listTextField.get(entete[i]).getText().isEmpty()) 
    				{
    					newDonnees.put(entete[i], "1");
    				} 
    				else
    				{
    					newDonnees.put(entete[i], listTextField.get(entete[i]).getText());
    				}
    			}
    			else 
    			{
    				if (listTextField.get(j).getText().isEmpty()) 
    				{
    					newDonnees.put(j, "1");
    					j++;
    				} 
    				else
    				{
    					newDonnees.put(j, listTextField.get(j).getText());
    					j++;
    				}
    			}
    		}
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void Modifier(HashMap<Object, String> donnees)
    	{
    		System.out.println("Avant modification : " + getDonnees());
    		setDonnees(donnees);
    		System.out.println("Après modification : " + getDonnees());
    	}

  2. #2
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Par défaut
    Bonjour,

    en ajoutant les objets de la Map dans un List, les 2 structures pointent sur les mêmes objets (dans le heap), donc la modification d'un objet à partir de la liste est une modification sur l'objet lui même (donc sur le map).
    Il faut être sûr que les objets de ton Map ne sont pas utilisés par une autre structure.

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Par défaut
    Salut,

    Merci pour la précision, donc si j'ai bien compris, une chaine de caractères dans le map qui est utilisé pour remplir un Textfield sera modifié si ce Textfield est lui même modifié?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Non. En fait je ne comprends pas pourquoi cette Map devrait ne pas être modifiée.

    Il y a des put() partout, ça sert à modifier la Map et pas à autre chose.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Par défaut
    Bonjour,

    Oui elle devrait être modifier si j'utilise le mutateur. Les put() agissent sur une map temporelle qui sera récupérer par l'accesseur. Hors la je n'utilise pas le mutateur et mes données sont modifier (comme si les 2 maps étaient synchronisé).

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    On comprend rien à tes explications et le code ne montre rien de tout ça.
    Il va falloir faire un effort de clarté.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Par défaut
    Alors je reprend. Avec j'espère plus de clarté.

    J'ai un objet "element" avec un map "donnees".
    Pour modifier ce map, je créé un panel "panelTempo" qui prend en paramètre ce map.
    Dans "panelTempo" je créé un map "newDonnees" qui va récupérer les valeurs de "donnees" et les afficher dans des Jtextfields.
    Lorsque l'utilisateur clique sur un bouton modifier, j'apelle la méthode panelTempo.Donnees() (le code se trouve dans mon premier message) qui avec les put() va changer les valeurs de "newDonnees", donc le map du panel.
    Le map "donnees" de "element" est alors modifié, hors je n'ai pas utilisé la méthode element.Modifier(Map panelTempo.getNewDonnees).
    La modification fonctionne mais je ne sais l'expliquer.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Pas mal pour les explications.

    Mais le problème que tu rencontres est sûrement dans le code que tu n'as pas montré. On ne peut donc rien pour toi.

    Là comme ça, je soupçonne que tu crées mal ta Map newDonnees.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Par défaut
    Merci de prendre le temps

    Alors le code :

    Création de panelTempo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    panelTempo = new Panel(aModifier.getDonnees());
    // panel est un objet, pas awt.Panel
    Constructeur du Panel :
    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
    17
     
    public Panel(HashMap<Object, String> donnees)
    	{
    		try 
    		{
    			newDonnees = new HashMap<Object, String>();
     
    			newDonnees = donnees;
                                           // newDonnees = new HashMap<Object, String>(donnees);
     
    //traitement pour le placement graphique des label et textfields
                              }
    			catch (Exception e) 
    		{
    			e.printStackTrace();
    		}
    }
    Je ne sais vraiment pas d'où peut venir mon problème...

  10. #10
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Par défaut
    Problème résolu avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newDonnees = new HashMap<Object, String>(donnees);
    Bien joué thelvin.

    J'avais déjà essayé cette solution plusieurs fois sans succés, mais la ça marche. Je touche plus rien en espérant que ça tienne


    Merci à toi

  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 : 45
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			newDonnees = new HashMap<Object, String>();
     
    			newDonnees = donnees;
    Ton new hashmap sert à rien, puisque au final tu lui dit d'utiliser donnees.

    C'est le code que tu as commenté qu'il fallait utiliser, qui créer une nouvelle hashmap contenant les mêmes données

    edit: grillé

  12. #12
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Par défaut
    Ha ouai j'y pense !
    Du coup, il est plus préférable d'utiliser une méthode modifier, ou d'utiliser newDonnees = donnees ?

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

Discussions similaires

  1. Destruction objet Java + modification HashMap
    Par Vespiras dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 25/09/2013, 08h12
  2. modification fichier avec hashmap
    Par icicmoi dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 11/04/2007, 19h50
  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. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Réponses: 11
    Dernier message: 23/07/2002, 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