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 :

La valeur récupérée n'est pas celle insérée (collection)


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut La valeur récupérée n'est pas celle insérée (collection)
    Bonjour,

    mon problème est le suivant : lorsque je récupère une valeur dans ma collection je constate que c'est pas la même que j'ai inséré .

    j'utilise la collection HashMap avec comme clé un string et comme valeur un tableau d'entier. voici mon code :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public class Dictionnaire implements Serializable{
     
        private HashMap table_cles;
     
        public Dictionnaire()
        {
            this.table_cles = new HashMap();
        }
     
        public boolean set(String nom, int[] cle)
        {
            if(this.table_cles.containsKey(nom) == false)
            {
                this.table_cles.put(nom, cle);
                return true;
            }
            else return false;
        }
     
        public int[] get(String nom)
        {
            if(this.table_cles.containsKey(nom))
            {
                return (int[])this.table_cles.get(nom);
            }
            else return null;
        }
     
        public void Remove(String nom)
        {
            this.table_cles.remove(nom);
        }
     
        public void RemoveAll()
        {
            this.table_cles.clear();
        }
     
        public int Size()
        {
            return this.table_cles.size();
        }
    dans une autre classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //....
    dico.set(mapkey, tab);
    for(int i = 0; i < tab.length; i++)
          System.out.print(tab[i]);
    //...
    //je fait quelque traitements 
    //et je récupère la mapkey, saisi par l'utilisateur (la même)
    tab= dico.get(mapkeyuti);
    System.out.println("");
    for(int i = 0; i < tab.length; i++)
             System.out.print(tab[i]);
    sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    0001111001110010
    1001010001111011
    le résultats des deux boucle for est différent! quelqu'un pourrait-il m'éclairer?

    merci à bientôt.

  2. #2
    Membre chevronné
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 158
    Par défaut
    On peut voir les "quelques traitements" ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Il n'y a rien d'étonnant !

    Ta variable ta a une certaine valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dico.set(mapkey, tab);
    for(int i = 0; i < tab.length; i++)
          System.out.print(tab[i]);
    Puis tu affecte à ta variable tap une valeur provenant dun clé saisie par l'utilisateur. Cette clé saisie par l'utilisateur a très peu de chance d'être exatement la même que ce qui a renvoyé ton 1er tab.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tab= dico.get(mapkeyuti);
    System.out.println("");
    for(int i = 0; i < tab.length; i++)
             System.out.print(tab[i]);

  4. #4
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par oneagaindoguys Voir le message
    Cette clé saisie par l'utilisateur a très peu de chance d'être exatement la même que ce qui a renvoyé ton 1er tab.
    Je citerais ce passage du code :
    Citation Envoyé par wassim_boy
    //et je récupère la mapkey, saisi par l'utilisateur (la même)
    Je suppose donc que le problème vient davantage des traitements que tu fais que de la clé (car pour ton test, je suppose que tu as bien fais attention d'avoir mapkey et mapkeyuti identiques).
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut
    je le confirme je rentre la même clé. je vais détailler plus mon problème.

    au fait l'utilisateur charge un fichier je dois modifier ses octets en utilisant le tableau tab et j'enregistre le nouveau fichier en rajoutant la mapkey au nom du nouveau fichier sans oublier d'insérer le tableau dans le HashMap ensuite je ferme mon application. la fermeture de l'application implique la sérialisation du dictionnaire et bien sûr à l'ouverture je le déserialise. pour retrouver le fichier de départ je récupère la mapkey pour avoir le tableau qui me permettra de générer le fichier de base.

    c'est en cliquant sur un bouton (valider) que je lance ces traitement. étant donné que j'ai une barre de progression j'utilise le swingworker et c'est dans celui la ou il y a le code qui effectue l'enregistrement des fichiers et l'insertion/récupération du tableau.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    public class Traitement extends JDialog {
        private JProgressBar progressBar;
        private JLabel edition;
        public Dictionnaire dico;
     
        /** Creates new form Traitement */
        public Traitement(java.awt.Frame parent, boolean modal) {
            super(parent, modal);
            initComponents();
            //....
            this.dico = this.Deserialiser();
        }
     
    //.......
     
    private void ValiderActionPerformed(java.awt.event.ActionEvent evt) {
        MonSwingWorker swingWorker;
        if(this.newbox.isSelected())
        {
            swingWorker = this.new MonSwingWorker(0, this.chemin.getText());
            swingWorker.execute();
        }
        else if(this.oldbox.isSelected())
        {
            swingWorker = this.new MonSwingWorker(1, this.chemin.getText());
            swingWorker.execute();
        }
        else
            JOptionPane.showMessageDialog(this,"Vous deveriez faire un choix entre crypter "
                    + "et décrypter en cochant une case.",
                        "Erreur", JOptionPane.ERROR_MESSAGE);
     
    }
     
    //......
     
    private class MonSwingWorker extends SwingWorker<Integer, String> 
    {
        private int choix;
        private String path;
        public MonSwingWorker(int c, String p) {
            this.choix = c;
            this.path = p;
            /* On ajoute un écouteur de barre de progression. */
            //.....
        }
     
        //fonctions doInBackground, process et done
        //.....
    je rajoute que une première fois je charge un fichier j'insere mon tableau et je le modifie en cliquant sur le bouton valider et la deuxième fois je charge le fichier précédemment crée je récupère mon tableau et je modifie le fichier.

    donc voila je comprend pas pourquoi je me retrouve avec un autre tableau complétement différent. je précise que je rentre la même clé et j'ai le même problème si j'utilise pas la sérialisation.

    merci pour vos réponse
    à bientôt.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut
    j'ai enlevé le swingworker et j'ai mis le code de la fonction traitement dans le actionperformed du bouton validé mais j'ai toujours le même problème.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut
    après de multiple teste je constate qu'il insère le tableau dans le HashMap après le traitement (alors que je l'insère avant de commencer le traitement) et vu que je le modifie dans le traitement je me retrouve avec un autre tableau.

    quelqu'un pourrait-il m'expliquer pourquoi?

    merci

  8. #8
    Membre chevronné
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 158
    Par défaut
    Citation Envoyé par wassim_boy Voir le message
    après de multiple teste je constate qu'il insère le tableau dans le HashMap après le traitement (alors que je l'insère avant de commencer le traitement) et vu que je le modifie dans le traitement je me retrouve avec un autre tableau.
    Comme tu te refuses toujours à nous montrer les "traitements" dont tu fais mention, je vais supposer (ainsi que je m'en doutais dès ton premier message et ainsi que ton dernier message semble le confirmer) que ton code ressemble à peu près à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // tu initialises le tableau tab
    int[] tab = ... ;
    // tu l'insères dans la map
    dico.set(mapkey, tab);
    // tu le modifies
    tab[0] = ... ;
    tab[1] = ... ;
    Dans ce cas :
    Il n'y a pas de mystérieuse inversion des instructions. Le tableau est bien inséré dans la map avant le traitement. Mais comme le traitement modifie le tableau... eh bien le tableau est modifié à la fin du traitement. Logique.
    Si tu comptes travailler sur les données du tableau tab sans modifier le contenu de la map, tu dois initialiser un nouveau tableau au lieu de continuer à travailler sur le même objet.

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ou pour le dire plus simplement, Java c'est pas PHP.
    PHP copie les tableaux avant d'en faire quoi que ce soit. Java garde le même : si on le modifie quelque part, on le modifie partout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Citation Envoyé par wassim_boy Voir le message
    je le confirme je rentre la même clé. je vais détailler plus mon problème.
    Je n'avais pas compris ça comme ça.

    Dans ce cas je cas je rejoint SucreGlace et thelvin sur le fait que tu dois bouger quelque chose dans ton tableau dans tes traitements

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut
    bonjour,

    merci pour vos réponse

    j'ai trouvé la solution j'utilise deux tableau le premier est celui que j’insère dans le hashmap et le deuxième est celui que je modifie.

    c'est la même solution que propose SucreGlace.

    je remercie tout ceux qu'ils ont participé.

    problème résolu

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

Discussions similaires

  1. La somme de valeurs numeriques n'est pas celle que j'attends.
    Par jeanphi45 dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 02/04/2010, 17h19
  2. Réponses: 0
    Dernier message: 09/09/2009, 22h06
  3. Réponses: 5
    Dernier message: 31/03/2008, 16h30
  4. Réponses: 2
    Dernier message: 20/09/2006, 08h58
  5. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 16h48

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