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

avec Java Discussion :

Problème de base


Sujet :

avec Java

  1. #1
    Membre habitué
    Problème de base
    Bonjour,
    J'ai un problème que je pense de base dont je vois d'ou il vient mais je ne sais pas comment y remédier :
    J'ai le modèle suivant : Livre étends Article et Livre posssède un champ de type Personne : dans mon exemple Livre est nommé LivreC3 , Article ArticleC et Personne PersonneC

    Classe Livre :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    import java.time.LocalDate;
    import java.util.ArrayList;
    
    public class LivreC3 extends ArticleC 
     { 
         private String isbn; 
         private int nbPages; 
         private PersonneC auteur;   Champ auteur de type PersonneC
          
         public LivreC3() 
             { 
                 super(); 
             } 
         public LivreC3(int reference,String designation,double 
    prix,String isbn,int nbPages) 
             { 
                 super(reference,designation,prix); 
                 setIsbn(isbn); 
                 setNbPages(nbPages); 
             } 
         //Constructeur à ne plus utiliser ne gère pas la liste des oeuvres et utilise variable de classe dans fonction
         public LivreC3(int reference,String designation,double 
        		 prix,String isbn,int nbPages,String nom,String prenom,LocalDate dnaiss) 
        		          {   
        		              super(reference,designation,prix); 
        		              setIsbn(isbn); 
        		              setNbPages(nbPages); 
        		              auteur=new PersonneC();
        		              auteur.setNom(nom);
        		              auteur.setPrenom(prenom);
        		              auteur.setDate_nais(dnaiss);
        		          } 
        
          public LivreC3(int reference,String designation,double 
        		 prix,String isbn,int nbPages,PersonneC auteur) 
        		          {   
        		              super(reference,designation,prix); 
        		              setIsbn(isbn); 
        		              setNbPages(nbPages); 
        		              setAuteur(auteur);
        		          } 
             public String getIsbn() { 
                 return isbn;          } 
      
             public void setIsbn(String isbn) { 
                 this.isbn = isbn; 
             } 
      
             public int getNbPages() { 
                 return nbPages; 
             } 
             public void setNbPages(int nbPages) { 
            	              this.nbPages = nbPages; 
            	          } 
            	   
             public PersonneC getAuteur() { 
            	             return auteur; 
            	          } 
            	   
         /*   public void setAuteur(PersonneC auteur) { 
            	              this.auteur = auteur; 
            	          } */
             public void setAuteur(PersonneC auteur) { 
            	              this.auteur = auteur; 
            	             ArrayList<ArticleC> lst; 
            	          //   lst=new ArrayList<> ();
            	             lst=auteur.getoeuvresList();
            	            if (!lst.contains(this)) 
            	            { 
            	                lst.add(this); 
            	             } 
            	        } 
            
            public String toString() 
            	          {       	            
            	              return super.toString() +
            	               " Nbre Pages : "	  + getNbPages() +
            	              " Auteur : " + getAuteur(); 	                
            	          } 
            	       
            	   }


    Classe Article
    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
     
    public class ArticleC  
     { 
         private int reference; 
         private String designation; 
         private double prix; 
     
         public ArticleC() 
             { 
                 super(); 
             } 
     
             public ArticleC(int reference) 
             { 
                 this(); 
                 setReference(reference); 
             } 
             public ArticleC(int reference,String designation) 
             { 
                 this(reference); 
                 setDesignation(designation); 
             } 
     
              public ArticleC(int reference,String designation, 
    double prix) 
              { 
                 this(reference,designation); 
                 setPrix(prix); 
             } 
     
             public int getReference()  
             { 
                 return reference; 
             } 
             public void setReference(int reference)  
                      { 
                          this.reference = reference; 
                      } 
     
                      public String getDesignation()  
                      { 
                          return designation; 
                      } 
     
                      public void setDesignation(String designation)  
                      { 
                          this.designation = designation; 
                      } 
     
                      public double getPrix() 
                      { 
                          return prix; 
                      } 
     
                      public void setPrix(double prix)  
                      { 
                          this.prix = prix; 
                      } 
     
                      public String toString() 
                      { 
                          return "Référence : "+ getReference() + " Désignation : " + getDesignation() + 
             " Prix : " + getPrix() + " €"; 
                      } 
     
                      }


    Classe Personne :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    import java.time.LocalDate;
    import java.util.ArrayList; 
     
     public class PersonneC  
     { 
         private String nom; 
         private String prenom; 
         private LocalDate date_nais; 
         private ArrayList<ArticleC> oeuvresList;
     
             public PersonneC() 
         { 
             super(); 
             oeuvresList=new ArrayList<> ();
         } 
     
         public PersonneC(String n,String p,LocalDate d) 
         { 
             this.nom=n; 
             this.prenom=p; 
             this.date_nais=d; 
         } 
     
         public PersonneC(String n,String p,LocalDate d,int ref,String des) //ajoute ref et des dans liste des oeuvres
         { 
             this.nom=n; 
             this.prenom=p; 
             this.date_nais=d;
             ArticleC oeuvre;
             oeuvre=new ArticleC();
             oeuvre.setReference(ref); 
             oeuvre.setDesignation(des); 
             oeuvresList=new ArrayList<>();
             oeuvresList.add(oeuvre);
         } 
     
         public ArrayList<ArticleC> getoeuvresList()  
         { 
           return oeuvresList; 
         } 
     
         public String getNom()  
         { 
           return nom; 
         } 
     
         public void setNom(String nom)  
         { 
            this.nom = nom; 
         }  
     
         public String getPrenom()  
         { 
           return prenom; 
         } 
         public void setPrenom(String prenom)  
              { 
               this.prenom = prenom; 
              } 
     
              public LocalDate getDate_nais()  
             { 
                return date_nais; 
              } 
     
              public void setDate_nais(LocalDate date_nais)  
              { 
                this.date_nais = date_nais; 
              } 
     
             public String toString() { 
                  return prenom  + " Classe PersonneC  " + nom + " " + date_nais; 
              } 
     
          }


    A l'exécution :
    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
     
    public static void main(String[] args) {
    		ArticleC a;
    	      LivreC3 l,l1;
    		DvdC3 d;
            PersonneC p;
     l1=new LivreC3();
            l1.setReference(123);
            l1.setDesignation("Le Pigeon");
            l1.setPrix(20.54);
            l1.setIsbn("1245879215");
            l1.setNbPages(254);
           l1.setAuteur(p=new PersonneC("Zone1","Eric1",LocalDate.of(1980, 12,11),l1.getReference(),l1.getDesignation()));
           System.out.println("il y a " + p.getoeuvresList().size() + " articles(s) dans la liste"); 
            System.out.println("il y a " + p.getoeuvresList() + " articles(s) dans la liste");

    Et en résultat :
    il y a 2 articles(s) dans la liste
    il y a [Référence : 123 Désignation : Le Pigeon Prix : 0.0 €, Référence : 123 Désignation : Le Pigeon Prix : 20.54 € Nbre Pages : 254 Auteur : Eric1 Classe PersonneC Zone1 1980-12-11] articles(s) dans la liste

    Et là ce trouve le problème il me compte 2 articles alors que j'en ai créé qu'un.
    Je pense que le problème vient de :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    l1.setAuteur(p=new PersonneC("Zone1","Eric1",LocalDate.of(1980, 12,11),l1.getReference(),l1.getDesignation()));

    qui utilise ce constructeur de Personne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public PersonneC(String n,String p,LocalDate d,int ref,String des) //ajoute ref et des dans liste des oeuvres
         { 
             this.nom=n; 
             this.prenom=p; 
             this.date_nais=d;
             ArticleC oeuvre;
             oeuvre=new ArticleC();
             oeuvre.setReference(ref); 
             oeuvre.setDesignation(des); 
             oeuvresList=new ArrayList<>();
             oeuvresList.add(oeuvre);
         }

    qui ajoute dans "oeuvresList" statique "oeuvre"
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     ArticleC oeuvre;
             oeuvre=new ArticleC();
             oeuvre.setReference(ref); 
             oeuvre.setDesignation(des); 
             oeuvresList=new ArrayList<>();
             oeuvresList.add(oeuvre);

    puis la méthode setAuteur
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void setAuteur(PersonneC auteur) { 
            	              this.auteur = auteur; 
            	             ArrayList<ArticleC> lst; 
            	          //   lst=new ArrayList<> ();
            	             lst=auteur.getoeuvresList();
            	            if (!lst.contains(this)) 
            	            { 
            	                lst.add(this); 
            	             } 
            	        }

    rajoute elle aussi dans la liste lst variable locale auteur de type Personne, c'est pour ca que le compte est à 2.
    Petite modif à mon message je viens de voir que si je rajoute pas à la liste classique le résultat est bon :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     public PersonneC(String n,String p,LocalDate d,int ref,String des) //ajoute ref et des dans liste des oeuvres
         { 
             this.nom=n; 
             this.prenom=p; 
             this.date_nais=d;
             ArticleC oeuvre;
             oeuvre=new ArticleC();
             oeuvre.setReference(ref); 
             oeuvre.setDesignation(des); 
             oeuvresList=new ArrayList<>();
          //   oeuvresList.add(oeuvre);   */    ici ligne en commentaire je ne rajoute pas à l a liste statique    
         }

    mais si je rajpute un autre livre :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     l1=new LivreC3();
            l1.setReference(124);
            System.out.println("ref = " + l1.getReference());
            l1.setDesignation("Le Pigeon Voyageur");
            l1.setPrix(28.54);
            l1.setIsbn("1245879217");
            l1.setNbPages(275);
            l1.setAuteur(p=new PersonneC("Zone2","Eric2",LocalDate.of(1980, 12,11),l1.getReference(),l1.getDesignation()));
     
            System.out.println("il y a (2ème Livre)" + p.getoeuvresList() + " articles(s) dans la liste"); 
            System.out.println("il y a (2ème Livre) " + p.getoeuvresList().size() + " articles(s) dans la liste");

    Le résultat est eronné soit tjrs un article :

    il y a 1 articles(s) dans la liste
    il y a [Référence : 123 Désignation : Le Pigeon Prix : 20.54 € Nbre Pages : 254 Auteur : Eric1 Classe PersonneC Zone1 1980-12-11] articles(s) dans la liste
    ref = 124
    il y a (2ème Livre)[Référence : 124 Désignation : Le Pigeon Voyageur Prix : 28.54 € Nbre Pages : 275 Auteur : Eric2 Classe PersonneC Zone2 1980-12-11] articles(s) dans la liste
    il y a (2ème Livre) 1 articles(s) dans la liste

    Voilà j'espère avoir été assez clair si quelqu'un pouvait m'aider MERCI

  2. #2
    Modérateur

    Hello,

    forcément puisque c'est une autre personne....
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Citation Envoyé par thelvin Voir le message
    Hello,

    forcément puisque c'est une autre personne....
    ******************************************************
    Merci pour ton aide, j'ai revu le problème et j'ai un peu avancé en créant une liste dans le code d'exécution, une liste d'Articles avec un Itérator soit :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     ArrayList<ArticleC> ListArticle;
            ListArticle=new ArrayList();
            Iterator<ArticleC> it=ListArticle.iterator();

    J'ai ensuite ajouté à l'exécution pour lister les éléments de la liste
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ListArticle.add(l);
            while (it.hasNext())
            {
            	l=(LivreC3) it.next(); //Problème ici  : Exception in thread "main" java.util.ConcurrentModificationException
            	System.out.println("Liste d'Article(s) " + l.toString());
            }

    et j'ai une erreur :
    Exception in thread "main" java.util.ConcurrentModificationException quand je caste en Livre
    Si tu as une idée
    MErci

  4. #4
    Membre régulier
    Si je ne dis pas de bêtise c'est normal car tu instancies un itérator et tu lui ajoutes quelque chose après à ta variable "ListArticle" (d'ailleurs une majuscule pour commencer le nom d'une variable ? ).
    Regarde cet article il est pas mal : https://www.journaldev.com/378/java-util-concurrentmodificationexception

    Si tu veux vraiment utiliser un itérator, tu dois l'instancier au dernier moment juste avant son utilisation.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            ArrayList<ArticleC> ListArticle;
            ListArticle=new ArrayList();
            ...
            ListArticle.add(l);
            Iterator<ArticleC> it=ListArticle.iterator();
     
            while (it.hasNext())
            {
            	l=(LivreC3) it.next(); //Problème ici  : Exception in thread "main" java.util.ConcurrentModificationException
            	System.out.println("Liste d'Article(s) " + l.toString());
            }


    Sinon question bête pourquoi ne pas utiliser un foreach ou encore un stream ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            ArrayList<ArticleC> listArticle;
            listArticle=new ArrayList();
            ...
            listArticle.add(l);
          for(ArticleC tmpArtcileC : ListArticle) {
               ...
          }


    ou encore

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    listArticle.stream().forEach(tmpArticleC -> ...);

  5. #5
    Membre habitué
    Citation Envoyé par Badshade23 Voir le message
    Si je ne dis pas de bêtise c'est normal car tu instancies un itérator et tu lui ajoutes quelque chose après à ta variable "ListArticle"
    Si tu veux vraiment utiliser un itérator, tu dois l'instancier au dernier moment juste avant son utilisation.

    *******************************************************
    Merci pour ta réponse, oui j'ai compris ça hier soir et j'allais poster le code qui fonctionne car ça peut être utile pour quelqu'un :
    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
    67
    68
    69
    70
    package Cours.Exos.ExosCorrection;
    
    import java.time.LocalDate; 
    import java.util.ArrayList; 
    import java.util.Iterator; 
    import java.util.ListIterator; 
    public class testArrayListExosCorr  
    { 
        public static void main(String[] args) 
        { 
        	ArticleC a0,a,a1;
        	LivreC3 l;
            ArrayList<PersonneC> liste1; 
            ArrayList<PersonneC> liste2; 
            ArrayList<ArticleC> ListArticle;
            ListArticle=new ArrayList<ArticleC>();
            // création des deux instances 
            liste1=new ArrayList<PersonneC>(); 
            liste2=new ArrayList<PersonneC>(); 
             
            // création des personnes pour remplir la liste 
            PersonneC p1,p2,p3,p4,p5,p6; 
            p1 = new PersonneC("Wayne", "John",LocalDate.of(1907,5,26)); 
            p2 = new PersonneC("McQueen", "Steeve",LocalDate.of(1930,3,24)); 
            p3 = new PersonneC("Lennon", "John",LocalDate.of(1940,10,9)); 
            p4 = new PersonneC("Gibson", "Mel",LocalDate.of(1956,1,3)); 
            p5 = new PersonneC("Willis", "Bruce",LocalDate.of(1955,3,19)); 
            p6=new PersonneC("Willisp6", "Bruce",LocalDate.of(1955,3,19)); 
            
            a=new ArticleC(122,"Le Pigeon0");
            a1=new ArticleC(121,"Le Pigeon-1");
            ListArticle.add(a);
            ListArticle.add(a1);
            Iterator<ArticleC> it1;
            it1=ListArticle.iterator(); Si tu veux vraiment utiliser un itérator, tu dois l'instancier au dernier moment juste avant son utilisation.
            
            while (it1.hasNext())
            {          	     		
            	a0=it1.next();
            	System.out.println("Liste d'Article(s) " + a0.toString());
            }
            // ajout de quatre personnes à la liste  
            liste1.add(p1); 
            liste1.add(p3); 
            liste1.add(p4); 
            liste1.add(p5); 
            liste1.add(p6);
             
           
        		 System.out.println("il y a " + liste1.size() + " personne(s) dans la liste"); 				 
          				  
    // parcours de la première liste du début vers la fin 
    Iterator<PersonneC> it; 
    it=liste1.iterator();   Si tu veux vraiment utiliser un itérator, tu dois l'instancier au dernier moment juste avant son utilisation.
    PersonneC p; 
    // tant qu’il reste des éléments  
    
    while (it.hasNext()) 
    { 
        // récupération de l’élément courant 
        p=it.next(); 
        System.out.println("Nom dans la liste " + p.getNom()); 
    } 
    
     
    
    	
    } 
    }


    (d'ailleurs une majuscule pour commencer le nom d'une variable ? ).

    en effet on doit pas faire ça mais Eclipse ne me signale aucun avertissement.

    Sinon question bête pourquoi ne pas utiliser un foreach ou encore un stream ?
    Je débute dans l'utilisation des listes si tu peux me dire ce qu'est un stream.
    MErci pour ton aide
    A+

  6. #6
    Membre régulier
    Salut,

    Citation Envoyé par xeron33 Voir le message
    *******************************************************
    en effet on doit pas faire ça mais Eclipse ne me signale aucun avertissement.
    Il y a certains réglages que tu peux faire avec Eclipse (formatage de code,ajout de plugin ...). Tu peux vraiment le paramétrer comme tu le désirs.
    Pour vérifier ton code tu as par exemple le plugin "checkstyle"

    http://objis.com/tutoriel-integration-continue-checkstyle-dans-eclipse/
    https://checkstyle.org/eclipse-cs/#!/

    Apres quoi qu'il arrive tu as des règles à respecter sur la syntaxe en JAVA et tu devras les connaitre sans même utiliser d'outil.
    • Une class commence toujours pas une maj
    • Les variables, paramètres, nom de méthode ne commencent jamais par une majuscule
    • Les constantes sont écrites toujours en MAJ ..
    • Il ne faut mettre aucun accent sur les noms de class,variables,paramètre .... Enfin fait tu ne trouveras jamais d'accent tout court ...
    • Etc...


    On utilise généralement le nommage appelé "Camel case" https://fr.wikipedia.org/wiki/Camel_case


    Citation Envoyé par xeron33 Voir le message
    *******************************************************
    Je débute dans l'utilisation des listes si tu peux me dire ce qu'est un stream.
    l'API Stream est apparue avec la grosse version de JAVA 8. Ils sont extrêmement utiles pour faire de nombreux traitements sur des listes , tableau, map ...
    Je te conseille cette page qui sera bien mieux expliquée que moi son fonctionnement : https://www.jmdoudoux.fr/java/dej/chap-streams.htm

    Mais leurs utilisation n'est pas obligatoire loin de là, le bon vieux foreach ou encore for(int=0;i<10;i++) à encore toute ça place. Pour des soucis de performance si tu parcours de petites listes le for(int=0;i<10;i++) est encore la meilleure solution.
    Tu as de nombreux tests qui ont été effectués sur ce sujet :
    https://jaxenter.com/java-performance-tutorial-how-fast-are-the-java-8-streams-118830.html
    https://blog.axopen.com/2014/05/java-8-stream-parallelstream-performance-string/

    Donc tout dépendra de ton besoin pour utiliser la meilleure façon, ton analyse en tant que développeur à toute ça place ici .
    Voilà normalement tu as toutes les cartes en main .
    En espérant avoir répondu à toutes tes questions.

  7. #7
    Membre habitué
    Merci pour ton aide
    A+