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 lecture dans un vector


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Par défaut problème de lecture dans un vector
    Bonjour,
    J'utilise un vector pour stocker des hashtable, le stockage se fait sans problèmes. Mais quand je veux parcourir le vector, il me retourne un élément qui semble ne pas exister dans le vector!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //ecriture
    if (new_entry) {
                        topics.addElement(topic);
                        System.out.println("elements lu dans la 1ere boucle " + topics.elementAt(f));
    f++;
                        topic.clear();
    ...
                    }
    //lecture
               for (int m = 0; m < topics.size(); m++) {
                        System.out.println("========= "+ " " + topics.elementAt(m));
    }
    Le résultat est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    elements lu dans la 1ere boucle {topic2_name=topic 3, topic1_name=topic 3}
    elements lu dans la 1ere boucle {topic2_name=topic 8, topic1_name=topic 8}
    elements lu dans la 1ere boucle {topic2_name=topic 9, topic1_name=topic 9}
    elements lu dans la 1ere boucle {topic2_name=topic 14, topic1_name=topic 14}...
    et ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    =========  {topic2_name=topic 1, topic1_name=topic 329}
    =========  {topic2_name=topic 1, topic1_name=topic 329}
    =========  {topic2_name=topic 1, topic1_name=topic 329}
    ...
    J'ai essayé avec elementAt(i) en changeant i à la main; et avec lastElement() et firstElement mais ça renvoie toujours la même entrée. Pourtant le size() renvoie la bonne valeur.

    Merci

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ton Vector ne semble contenir qu'un seul et unique élément... plusieurs fois !

    a++

    [edit] Et préfères List/ArrayList à Vector... sans oublier qu'il est préférables d'utiliser l'Iterator ou la boucle for-étendus plutôt qu'une boucle indexé pour affiché tous les éléments...

  3. #3
    Membre confirmé Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Ton Vector ne semble contenir qu'un seul et unique élément... plusieurs fois !
    Bonjour

    donc comment on peut expliquer que l'affichage est bon dans la 1ère boucle?

    Merci

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Parce que tu dois faire l'affichage juste après avoir changé la valeur de l'objet...

    Il n'y a pas de mystère : si tu veux plusieurs objets ? Alors il faut créer plusieurs objets.

    Je rappelle que contrairement au C++, il n'y a pas de copie implicite en Java...

    a++

  5. #5
    Membre confirmé Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Parce que tu dois faire l'affichage juste après avoir changé la valeur de l'objet...

    Il n'y a pas de mystère : si tu veux plusieurs objets ? Alors il faut créer plusieurs objets.

    Je rappelle que contrairement au C++, il n'y a pas de copie implicite en Java...

    a++
    çàd qu'à chaque fois que le contenu de topic change, le contenu change dans toute les entrées du vecteur? J'ai cru que quand je fais topics.addElement(topic), il rajoute juste le contenu de topic sans chercher si ce contenu changera par la suite!!
    Merci pour la réponse.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Il manque des éléments dans ton bout de code pour que nous puissions voir ce que tu fais :
    - d'où sort l'objet "topic" ?
    - que fait la fonction topic.clear() ?


    Citation Envoyé par abir84 Voir le message
    donc comment on peut expliquer que l'affichage est bon dans la 1ère boucle?
    Déjà on peut remarquer que dans la première boucle, juste après avoir affiché un élément, tu le modifies (topic.clear()) donc ça commence mal si tu t'attends à obtenir le même résultat à l'affichage.
    Ensuite, comme dit plus haut, nous ne risquons pas de deviner ce que tu fais en dehors des quelques lignes de code montrées ... Si ça se trouve tu utilises toujours le même objet topic, comme l'a suggéré adiGuba au vu de l'affichage dans la deuxième boucle.


    Citation Envoyé par abir84 Voir le message
    çàd qu'à chaque fois que le contenu de topic change, le contenu change dans toute les entrées du vecteur? J'ai cru que quand je fais topics.addElement(topic), il rajoute juste le contenu de topic sans chercher si ce contenu changera par la suite!!
    Si tu modifies l'objet topic, alors forcément il sera modifié
    Quand à "copier le contenu" : qu'est-ce que ça veut dire pour toi ? Tu as un objet, tu le mets dans un vecteur... eh bien c'est cet objet, cette instance, qui est stocké dans le vecteur. Si tu ne fais pas appel à un constructeur ou à une méthode "copy" ou "clone" (qui elle-même appellera un constructeur) aucun nouvel objet ne sera créé.

  7. #7
    Membre confirmé Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    [edit] Et préfères List/ArrayList à Vector... sans oublier qu'il est préférables d'utiliser l'Iterator ou la boucle for-étendus plutôt qu'une boucle indexé pour affiché tous les éléments...
    C,est quoi la différence?
    En fait j'ai utilisé Vector juste parce que j'ai besoin de stocker des éléments dont je connais pas le nombre, donc j'ai besoin d'une structure qui ressemble aux tableaux mais sans connaitre la taille a priori.

    Citation Envoyé par Astartee Voir le message
    ...

    Si tu modifies l'objet topic, alors forcément il sera modifié
    Quand à "copier le contenu" : qu'est-ce que ça veut dire pour toi ? Tu as un objet, tu le mets dans un vecteur... eh bien c'est cet objet, cette instance, qui est stocké dans le vecteur. Si tu ne fais pas appel à un constructeur ou à une méthode "copy" ou "clone" (qui elle-même appellera un constructeur) aucun nouvel objet ne sera créé.
    Merci, j'avais une confusion. J'ai cru que lorsque je fais un addElement(objet), un nouveau objet est construit automatiquement. JE savais pas que ça pointait vers l'objet ajouté
    J'ai essayé avec clone et ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    topics.addElement(topic.clone());
                        topic.clear();
    Merci

  8. #8
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abir84 Voir le message
    C,est quoi la différence?
    En fait j'ai utilisé Vector juste parce que j'ai besoin de stocker des éléments dont je connais pas le nombre, donc j'ai besoin d'une structure qui ressemble aux tableaux mais sans connaitre la taille a priori.
    Vector date du tout début de Java, et possède deux gros défaut :
    • elle est synchronisé (et donc potentiellement moins performance si tu l'utilise en mono-thread).
    • elle a une API pas très clair, avec énormément de méthode


    En gros tu la remplaces par ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<TaClasseTopic> topics = new ArrayList<TaClasseTopic>();
    puis tu utilises add() au lieu de addElement()...


    Quand à l'iterator et la boucle étendu de Java 5, cela te permet de parcourir tous les éléments comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (TaClasseTopic topic : topics) {
          System.out.println("========= "+ " " + topic);
    }
    Citation Envoyé par abir84 Voir le message
    Merci, j'avais une confusion. J'ai cru que lorsque je fais un addElement(objet), un nouveau objet est construit automatiquement. JE savais pas que ça pointait vers l'objet ajouté
    J'ai essayé avec clone et ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    topics.addElement(topic.clone());
                        topic.clear();
    Merci
    Plutôt que de faire un clone() pas très joli. Crée simplement l'objet juste avant de l'ajouter plutôt qu'au tout début de ton code comme tu dois le faire actuellement...


    a++

Discussions similaires

  1. problème de lecture dans un fichier
    Par phy4me dans le forum Fortran
    Réponses: 1
    Dernier message: 20/05/2007, 20h55
  2. [XML][DOM][ZIP] Problème de lecture dans un zip
    Par gocin dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 04/04/2007, 11h41
  3. Problème de lecture dans un tableau associatif … ?
    Par sadao dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/07/2006, 22h24
  4. Problème de lecture dans un stream!
    Par chrono23 dans le forum C++
    Réponses: 27
    Dernier message: 16/06/2006, 12h08
  5. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 00h13

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