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 :

Pb ArrayList - get()


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 28
    Points
    28
    Par défaut Pb ArrayList - get()
    Bonjour,

    Après moultes essais, je dois mal utiliser la méthode get() des ArrayList.

    Ma classe Main affiche 3 fois le même objet de l'Array (le dernier) au lieu d'afficher les trois éléments...(j'ai vérifié, ils sont saisis correctement dans l'Array).

    Si vous voyez une cacahouète dans mon code...ça doit sûrement venir de là...

    Main :
    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
     
    package Gestion_SCE;
    import java.util.*;
     
    public class Main {
     
        private static Locale locale = null;
     
        public static void main(String[] args) {
            int i=0;
     
            // Gestion de l'internationalisation
            if (args.length != 2)
                locale = new Locale("fr","FR");
            else 
                locale = new Locale(args[0], args[1]);
     
            Hosts_Nagios Hosts = new Hosts_Nagios(locale);
            Hosts.LectureFichier();
            Services_Nagios Serv = new Services_Nagios(locale);
            Serv.LectureFichier();
     
            // Test de construction de l'array final et affichage du dernier 
            Array_Complet Res = new Array_Complet();
            Res.Construction(Hosts, Serv);
            System.out.println();
            System.out.println("Liste des paramètres définitifs");
            System.out.println("Taille du tableau final : " + Res.finale.size());
            for(i=0;i<Res.finale.size();i++){
                Complet tmp_obj = new Complet();
                tmp_obj = (Complet) Res.finale.get(i);
     
                System.out.print("Hote : " + tmp_obj.getNom() + ",");
                System.out.print("Ip : " + tmp_obj.getIp() + ",");
                System.out.print("Service : " + tmp_obj.getService() + ",");
                System.out.println("Ligne de commande : " + tmp_obj.getCommande() + ",");
                System.out.print("Chemin d'accès : " + tmp_obj.getPath() + ",");
                System.out.print("TempsDepartDown : " + tmp_obj.getTempsDepartDown() + ",");
                System.out.print("TempsCheck : " + tmp_obj.getTempsCheck() + ",");
                System.out.println("TempsDepartScript : " + tmp_obj.getTempsDepartScript() + ",");
                System.out.print("EtatInit : " + tmp_obj.getEtatInit() + ",");
                System.out.println("EtatLocal : " + tmp_obj.getEtatLocal());
                System.out.println();
            }
        }
    }
    et la classe array_complet :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    package Gestion_SCE;
    import java.io.*;
    import java.util.*;
    import java.util.regex.Pattern;
     
    public class Array_Complet {
     
        public ArrayList finale;
        public Array_Complet(){
            finale = new ArrayList();
        }
     
        public ArrayList Construction (Hosts_Nagios Hosts, Services_Nagios Serv){
     
            // Variables
            NomIp Obj_Hote_Temporaire = new NomIp("", "");
            NomService Obj_Service_Temporaire = new NomService("", "", "", "");
            Complet Obj_Complet = new Complet();
            int i=0, j=0, compteur=0;
     
            for (i=0 ; i < Hosts.Array_NomIp.size() ; i ++){
                Obj_Hote_Temporaire = (NomIp)Hosts.Array_NomIp.get(i);
     
                for (j=0 ; j < Serv.Array_NomService.size() ; j ++){
                    Obj_Service_Temporaire = (NomService)Serv.Array_NomService.get(j);
     
                    if (Obj_Hote_Temporaire.getNom().equals (Obj_Service_Temporaire.getNom())){
                        Obj_Complet.setNom(Obj_Hote_Temporaire.getNom());
                        Obj_Complet.setIp(Obj_Hote_Temporaire.getIp());
                        Obj_Complet.setService(Obj_Service_Temporaire.getService());
                        Obj_Complet.setCommande(Obj_Service_Temporaire.getCommande());
                        Obj_Complet.setPath("/LesHotes/Scripts/" + Obj_Hote_Temporaire.getNom() + "/");
                        Obj_Complet.setTempsCheck(Obj_Service_Temporaire.getTemps());
                        Obj_Complet.setTempsDepartScript(""); // à valider avec l'interface
     
                        System.out.println("Valeur d'Obj_Complet avant ajout dans l'array finale :");
                        System.out.print(Obj_Complet.getNom() + " - ");
                        System.out.print(Obj_Complet.getIp() + " - ");
                        System.out.print(Obj_Complet.getPath() + " - ");
                        System.out.print(Obj_Complet.getService() + " - ");
                        System.out.print(Obj_Complet.getCommande() + " - ");
                        System.out.println(Obj_Complet.getTempsCheck());
     
                        /** Ajout de l'élément complet dans le nouveau tableau */
                        finale.add(Obj_Complet);
                        compteur ++;
     
                        // verif de ce qui a été ajouté
                        Complet tempo = new Complet();
                        tempo = (Complet)finale.get(compteur-1);
                        System.out.println("Valeur de l'objet ajouté précédemment :");
                        System.out.print(tempo.getNom() + " - ");
                        System.out.print(tempo.getIp() + " - ");
                        System.out.print(tempo.getPath() + " - ");
                        System.out.print(tempo.getService() + " - ");
                        System.out.print(tempo.getCommande() + " - ");
                        System.out.println(tempo.getTempsCheck());
                        System.out.println();
     
                    }
                }
            }
            return finale;
        }
    }

  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
    Déjà on parcours une List avec un Iterator, ensuite ton code est (SUPER) "crade" :
    - pense aux conventions de nommage (classes, attributs, paramètres...)
    - à l'accessibilité des attributs d'une instance (quasiment toujours private...)
    - à l'héritage (même d'une Collection si seulement des ajouts sans redéfinition...)
    - aux constructeurs (et pas aux méthodes de construction...)
    - ...

    Bref ; va voir les cours et tutoriels d'abord.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Merci pour ces conseils mais ça me fait pas du tout avancer...et les tutoriaux j'en ai fait plein...ceux d'ici ou de bouquins.
    Je préfèrerai des idées de débuggages...

    Pour ce qui est du Iterator, je vois pas pourquoi j'irai m'embêter à utiliser ce truc alors que les programmeurs ont fait la méthode get() pour les ArrayLists...

  4. #4
    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
    http://java.sun.com/j2se/1.4.2/docs/...util/List.html
    Thus, iterating over the elements in a list is typically preferable to indexing through it if the caller does not know the implementation.
    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
     
    public class ClasseMain {    
        public static void main(String[] args) {
            ArrayComplet res = new ArrayComplet();
            res.construire(hosts, services);
            Iterator parcours = res.iterator();
            while (parcous.hasNext()) {
                Complet tmpObj = (Complet) parcours.next();
                //TODO
            }
        }
    }   
     
    public class ArrayComplet extends ArrayList {
        public void construire(HostsNagios hosts, ServicesNagios services) {
            //TODO
        }
    }

  5. #5
    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,


    Citation Envoyé par g_rare
    http://java.sun.com/j2se/1.4.2/docs/...util/List.html
    Thus, iterating over the elements in a list is typically preferable to indexing through it if the caller does not know the implementation.
    Plus exactement, on ne devrait pas utiliser les get() pour le parcours, sauf dans le cas où la List implémente RandomAccess, ce qui est le cas d'ArrayList et Vector...

    Mais cela peut s'avérer désastreux avec d'autres implémentation (LinkedList par exemple).



    Pour en revenir à ton problème : tu ajoutes a chaque fois le même objet dans la liste. C'est donc normal que tu ai à chaque fois les valeurs de la dernière itération, puisque c'est la dernière fois où tu as modifié l'objet...



    Sinon même remarques que g_rare : c'est illisible http://cyberzoide.developpez.com/java/javastyle/

    a++

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Re,

    voilà le code une fois changé avec l'iterator :

    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
     
    public class Main {
     
        private static Locale locale = null;
     
        public static void main(String[] args) {
     
            int i=0;
     
            // Gestion de l'internationalisation
            if (args.length != 2) {
                locale = new Locale("fr","FR");
            } else { 
                locale = new Locale(args[0], args[1]);
            }
     
            HostsNagios hosts = new HostsNagios(locale);
            hosts.lectureFichier();
     
            ServicesNagios serv = new ServicesNagios(locale);
            serv.lectureFichier();
     
            ArrayComplet res = new ArrayComplet();
            res.construire(hosts, serv);
            Iterator parcours = res.iterator();
            while (parcours.hasNext()) {
                Complet tmpObj = (Complet) parcours.next();
     
                System.out.println();
                System.out.print("Hote : " + tmpObj.getNom() + ",");
                System.out.print("Ip : " + tmpObj.getIp() + ",");
                System.out.print("Service : " + tmpObj.getService() + ",");
                System.out.println("Ligne de commande : " + tmpObj.getCommande() + ",");
                System.out.print("Chemin d'accès : " + tmpObj.getPath() + ",");
                System.out.print("TempsDepartDown : " + tmpObj.getTempsDepartDown() + ",");
                System.out.print("TempsCheck : " + tmpObj.getTempsCheck() + ",");
                System.out.println("TempsDepartScript : " + tmpObj.getTempsDepartScript() + ",");
                System.out.print("EtatInit : " + tmpObj.getEtatInit() + ",");
                System.out.println("EtatLocal : " + tmpObj.getEtatLocal());
                System.out.println();
            }
        }
    mais c'est toujours comme avec le get(), j'ai toujours droit à 3 fois le même objet à l'affichage.


    Pour en revenir à ton problème : tu ajoutes a chaque fois le même objet dans la liste. C'est donc normal que tu ai à chaque fois les valeurs de la dernière itération, puisque c'est la dernière fois où tu as modifié l'objet...
    J'ai pas compris ta remarque quant à l'ajout de l'élément dans l'array... vu que je change les paramètres, ce n'est pas le même que je rajoute...

    PS : j'espère que le code est un peu plus lisible...

  7. #7
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    mais tu as le meme pb dans la méthode construire. As tu mis des iterator ici aussi.

    la lecture est bonne, c'est l'insertion qui pêche.

    Ps : tu devrais faire une méthode toString pour tes objets Complets ...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    En fait, je n'arrive pas à mettre les iterator dans construire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
            while (parcoursHotes.hasNext()) {
                objHoteTemporaire = hosts.arrayNomIp.next();
     
                while (parcoursServices.hasNext()){
                    objServiceTemporaire = serv.arrayNomService.next();
    cannot find symbol
    symbol : method : next()
    location : java.util.ArrayList
    alors que j'ai bien mis : public class ArrayComplet extends ArrayList {

    PS : je suis en JDK 1.4 puisque le but final est une appli web

  9. #9
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    la méthode next se rapporte à l'iterator. Elle sert à "déplacer le curseur" et à renvoyer l'objet courant ... Et il faut caster l'objet courant en le bon type

    c'est donc plutot un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (parcoursHotes.hasNext()) {
                objHoteTemporaire = (NomIp) parcoursHotes.next();
     
                while (parcoursServices.hasNext()){
                    objServiceTemporaire = (NomService) parcoursServices.next();
    l'erreur que tu as te dis qu'il n'existe pas de méthode next() sur ArrayList.
    Il faut lire la javadoc, pour s'en sortir en Java

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    ohhh la boulette.... c vraiment vendredi soir par 35° à l'ombre... pfiuuu....

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Points : 28
    Points
    28
    Par défaut
    Bon, ça y est, j'ai trouvé d'où ça vient...si ça peut servir à d'autres, voilà la structure que j'ai adopté finalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Definition itérateur 1
     
            while (itérateur1.hasNext()) {
                // TODO
                Definition itérateur 2
     
                while (itérateur2.hasNext()){
                // TODO
    A +
    Arnapou

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

Discussions similaires

  1. add et get de arrayList
    Par newuser dans le forum Struts 1
    Réponses: 1
    Dernier message: 19/03/2007, 08h00
  2. gets() a la suite de scanf() -> probleme
    Par ickis dans le forum C
    Réponses: 12
    Dernier message: 14/12/2003, 20h24
  3. gets ,fgets
    Par Zazeglu dans le forum C
    Réponses: 2
    Dernier message: 19/09/2003, 18h24
  4. Créer les get et set des classes
    Par cameleon2002 dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/09/2003, 21h03
  5. url d'une page asp ou upload avec get
    Par taupin dans le forum ASP
    Réponses: 18
    Dernier message: 22/08/2003, 14h25

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