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 :

Ajout de données dans une ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Ajout de données dans une ArrayList
    Bonjour, j'ai un soucis avec la gestion d'un ArrayList.
    Il s'agit d'une gestion de commande de fournitures. Une "ligne" de ma list doit au final contenir un nom, un article, et une quantité.
    En utilisant un constructeur de type (String, Article, int) je n'ai pas de soucis tout est bien ajouté.
    Seulement je voudrais créer une commande avec seulement le nom et plus tard lui ajouter articles et quantité.

    Mon main ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Commande uneCommande = new Commande("Alex");
     
    Stylo unStylo = new Stylo(....); // Création d'un article
     
    uneCommande.addLigne(unStylo, 3); // on commande 3 stylos "unStylo"
    Mon problème c'est donc le "addLigne". Je ne vois pas comment "ajouter" les informations à un objet déjà créé.
    Merci de votre aide.

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Je ferais plutôt une map des articles avec en regard la quantité :

    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
    class Commande  {
     
       String nom;
       Map<Article, Quantite> mapArticles = new HashMap<Article, Quantite>();
     
       public void addLigne(Article unArticle, int enQuantite) {
          Quantite quantite = mapArticles.get(unArticle);
          if (quantite == null) {
             quantite = new Quantite();
             mapArticles.put(unArticle, quantite);
          }
          quantite.n += enQuantite;
       }
    }
     
    class Quantite {
       int n;
    }

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    N'y a t il pas un moyen d'appeller un constructeur de Commande depuis la méthode addLigne ?
    J'aurais ainsi dans commande deux constructeurs

    Commande(String nom); // Pour la premiere création de commande
    Commande(String nom, Articles a, int q); // Pour lorsque je veux ajouter

    Et dans addLigne je voudrais faire un appel au second.

    (je suis sûr que cela doit fonctionner avec Map comme tu me le conseil, mais je n'ai pas encore vu ça, et l'exercice était faisable sans, donc soit je cherche trop compliqué, soit je loupe un truc evident )

  4. #4
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    addLigne est bien une méthode de Commande ? quelle est sa signature ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Oui addLigne est bien une méthode de Commande. Qu'appelles-tu "sa signature" ?

  6. #6
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Par exemple dans un message plus haut, on trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void addLigne(Article unArticle, int enQuantite)
    c'est la signature de la méthode addLigne

    Je ne comprends pas bien, une commande est-elle composée de plusieurs articles, chacun dans une quantité donnée ?
    Si c'est la cas je ne vois pas en quoi la méthode addLigne devrait appeler un constructeur de Commande puisque addLigne est une méthode de Commande !

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Je ne comprends pas bien, une commande est-elle composée de plusieurs articles, chacun dans une quantité donnée ?

    Oui! je crée une commande au debut de mon main, et je dois pouvoir lui ajouter des articles au fur et à mesure.

    uneCommande.addLigne(unStylo, 3)
    uneCommande.addLigne(unFeutre, 5)
    ...

    Et à la fin je dois pouvoir afficher tout ce que j'ai ajouté à uneCommande.



    Si c'est la cas je ne vois pas en quoi la méthode addLigne devrait appeler un constructeur de Commande puisque addLigne est une méthode de Commande !

    Ma question était un peu désespérée en fait . Je ne vois pas comment ajouter les commandes au fur et à mesure, dans une même commande...

  8. #8
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Comment as-tu associé la quantité à un article dans l'ArrayList de Commande ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Justement ! C'est la tout mon problème

    Je crée une commande avec le nom de la personne :

    Commande uneCommande = new Commande("Alex");

    Je crée un Article :

    Article unStylo = new Article(.......);


    Je veux ajouter cet article à ma commande uneCommande (et donc l'associer à "Alex") via la méthode addLigne !

    Ma classe commande ressemble à ça :
    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
     
     
    public class Commande {
     
    	private String nom;
    	private Articles article;
    	private int quantite;
    	private static ArrayList<Commande>  toutesLesCommandes = new ArrayList<Commande>();
     
    	Commande(String name){
     
    		nom = name;
     
    	}
     
                 public void addLigne(Articles art, int nb){
     
    		 // Je fais quoi la dedans ?? ;)
     
    	}
    Je précise qu'en première intention, j'avais fait ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public void addLigne(Articles art, int nb){
     
    article = art; 
    quantite = nb;
    toutesLesCommandes.add(this);
     
    }
    Mais la seconde commande effacait toujours la première...

  10. #10
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    toutesLesCommandes n'est pas une ArrayList de Command mais d'Articles !
    Comment doit réagir ton application si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uneCommande.addLigne(unStylo, 3);
    uneCommande.addLigne(unStylo, 5);
    Doit-on avoir deux lignes correspondant à :
    unStylo 3
    unStylo 5
    ou une seule ligne correspondant à :
    unStylo 8
    ?

  11. #11
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    C'est une très bonne question...

    Je dois afficher un résumé de ma commande (via System.Out.println(uneCommande)).

    Je pense que je peux me contenter de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unStylo 3
    unStylo 5
    pour le moment !

  12. #12
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Ok alors ceci devrait suffire :
    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
    	public class Article {
     
    		private String nom;
     
    		public Article(String nom) {
    			this.nom = nom;
    		}
     
    		public String getNom() {
    			return nom;
    		}
    	}
     
    	public class Ligne {
     
    		private Article article;
    		private int quantite;
     
    		public Ligne(Article article, int quantite) {
    			this.article = article;
    			this.quantite = quantite;
    		}
     
    		public Article getArticle() {
    			return article;
    		}
     
    		public int getQuantite() {
    			return quantite;
    		}
    	}
     
    	public class Commande {
     
    		private String nom;
    		private List<Ligne> listeLignes = new ArrayList<Ligne>();
     
    		public Commande(String nom) {
    			this.nom = nom;
    		}
     
    		public String getNom() {
    			return nom;
    		}
     
    		public void addLigne(Article article, int quantite) {
    			Ligne ligne = new Ligne(article, quantite);
    			listeLignes.add(ligne);
    		}
     
    		public List<Ligne> getlisteLignes() {
    			return listeLignes;
    		}
    	}

  13. #13
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    J'ai "simplifier" le problème en recommencant de zero.
    Mon main se résume à ça:

    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
     
    public class Appli {
     
    	public static void main(String[] args) {
     
    		Liste pers1 = new Liste("Mouse", "Mickey");
     
    		Pouvoir pow1 = new Pouvoir("Voler");
    		Pouvoir pow2 = new Pouvoir("Teleporter");
     
    		pers1.addPower(pow1,10);
    		pers1.addPower(pow2,50);
     
     
    		Liste.affAll();
     
    	}
     
    }
    En sortie j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Mickey Mouse Teleporter 50
     Mickey Mouse Teleporter 50
    Alors que je voudrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Mickey Mouse Voler 10
     Mickey Mouse Teleporter 50

    Le code de la classe Liste :
    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
     
    import java.util.ArrayList;
     
     
    public class Liste {
     
    	private String nom;
    	private String prenom;
    	private Pouvoir pouvoir;
    	private int puissance;
     
    	private static ArrayList<Liste> toutesLesPersonnes = new ArrayList<Liste>();
     
     
    	Liste(String fName, String lName){
     
    		nom = lName;
    		prenom = fName;
     
    	}
     
     
     
    	public void addPower(Pouvoir pow, int power){
     
    		pouvoir = pow;
    		puissance = power;
    		toutesLesPersonnes.add(this);
     
    	}
     
    	public static void affAll(){
     
    		for(int i = 0; i < toutesLesPersonnes.size(); ++i)
    			System.out.println(toutesLesPersonnes.get(i));
     
    	}
     
    	public String toString(){
     
    		return(nom + " " + prenom + " " + pouvoir + puissance);
    	}
     
     
    }
    Et celui de la classe pouvoir :
    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
     
     
     
    public class Pouvoir {
     
    	private String nom;
    	private int puissance;
     
    	Pouvoir(String name){
     
    		nom = name;
     
     
    	}
     
    	public String toString(){
     
    		return nom;
     
    	}
    }

    Ca me semble plus clair, mais le pb (et donc le résultat) est le même !

    Merci de ton aide, en attendant, je regarde la solution que tu me propose.

  14. #14
    Membre du Club
    Profil pro
    Coach Agile
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Points : 56
    Points
    56
    Par défaut
    En fait, tu veux gérer (dans la dernière version) une liste de pouvoir dans ta classe Liste. Alors qu'avec le code source que tu fournis, tu ne gères qu'un seul et unique pouvoir par "Liste" (le nom de classe est très mal choisi).

    En me basant sur les sources de ton dernier post, voici une solution :
    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
    import java.util.ArrayList;
    import java.util.Hashtable;
     
    public class Pouvoir {
     
    	private String nom;
     
    	Pouvoir(String name){		
    		nom = name;		
    	}
     
    	public String toString(){		
    		return nom;		
    	}
    }
     
    public class Liste {
     
    	private String nom;
    	private String prenom;
    	private int puissance;
    	private Hashtable pouvoirs;
     
    	private static ArrayList<Liste> toutesLesPersonnes = new ArrayList<Liste>();
     
     
    	Liste(String fName, String lName){		
    		nom = lName;
    		prenom = fName;
    		toutesLesPersonnes.add(this);
    		pouvoirs =  = new Hashtable();
    	}
     
    	public void addPower(Pouvoir pow, int power){
    		pouvoirs.put(pow, power);
    	}
     
    	public static void affAll(){
     
    		for(int i = 0; i < toutesLesPersonnes.size(); ++i){
    			System.out.println(toutesLesPersonnes.get(i));
    		}
     
    	}
     
    	public String toString(){
    		String buffer = nom + " " + prenom + " : ";
    		for (Pouvoir pow : pouvoirs.keys()) {
    			buffer += "\r\n\t" + pow.toString() + " "+ pouvoirs.get(pow);
    		}
    		return(buffer + "\r\n");
    	}
     
     
    }
    Par contre dans le toString de la classe Liste il manque peut être un cast (pour le foreach) et surtout il faut revoir ton découpage objet avec par exemple :
    Une classe Personnage avec nom, prénom et liste de pouvoir
    une classe Pouvoir avec nom et puissance
    une classe ListePersonnage avec une liste de personnage (ou mieu héritant de ArratList<Personnage> pour la manipuler plus facilement

  15. #15
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Alors la réponse simpliste que je cherchais était celle là:
    Simplement rajouter une ArrayList dans ma classe Liste (qui oui à un très mauvais nom), et dans addPower, ajouter le pouvoir à cette liste.


    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
     
    public class Appli {
     
    	public static void main(String[] args) {
     
    		Liste pers1 = new Liste("Mouse", "Mickey");
     
    		Pouvoir pow1 = new Pouvoir("Voler");
    		Pouvoir pow2 = new Pouvoir("Teleporter");
     
    		pers1.addPower(pow1);
    		pers1.addPower(pow2);
     
     
    		Liste.affAll();
     
    	}
     
    }
    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
     
     
    import java.util.ArrayList;
     
     
    public class Liste {
     
    	private String nom;
    	private String prenom;
    	private Pouvoir pouvoir;
    	private int puissance;
    	private ArrayList mesPouvoirs = new ArrayList();
    	private static ArrayList<Liste> toutesLesPersonnes = new ArrayList<Liste>();
     
     
     
    	Liste(String fName, String lName){
     
    		nom = lName;
    		prenom = fName;
     
    	}
     
     
     
    	public void addPower(Pouvoir pow){
     
    		mesPouvoirs.add(pow);
     
    	}
     
    	public static void affAll(){
     
    		for(int i = 0; i < mesPouvoirs.size(); ++i)
    			System.out.println(mesPouvoirs.get(i));
     
    	}
     
    	public String toString(){
     
    		return(nom + " " + prenom + " " + pouvoir + puissance);
    	}
     
     
    }
    Voilà, merci à tous pour vos idées et solutions éventuelles.

Discussions similaires

  1. Ajout de données dans une ArrayList
    Par k-sper dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/11/2010, 23h27
  2. Ajout de données dans une requête
    Par remi59 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 15/06/2006, 10h30
  3. Réponses: 8
    Dernier message: 24/02/2006, 09h59
  4. ajouter des données dans une requête htttp en js
    Par jeromejanson dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/10/2005, 15h34

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