Affichage variable hashset java

mfpresta13 -  
 mfpresta13 -
Bonjour,

Tout d'abord voici ma classe:


import java.util.HashSet;    
import java.util.Iterator;    

public class Cocktail extends Boisson{    

 public double degreAlcool;    
 public double grammeSucre;    
 protected boolean alcoolise;    
 protected HashSet<Boisson> composition; // composition = collection de boisson    
  
 // constructeur    
 public Cocktail(String nom, Double prix) {    
       super(nom, prix);    
       this.composition = new HashSet<Boisson>();    
 }    

  // Parcourt de la collection composition pour afficher les composants du cocktail    
  public String affComposition()    
 {    
       Iterator<Boisson> it = composition.iterator();    
       while (it.hasNext())    
       {    
              System.out.println(it.next());    
       }    
       return "Composants: "+nom;     
 }    

  public static void main(String[] args)     
 {    
       BoissonAlcoolisee whisky = new BoissonAlcoolisee("whisky", 2.00, 40, 0.4);// nom, prix, qte, degreAlcool    
       BoissonNonAlcoolisee coca = new BoissonNonAlcoolisee("coca", 0.05, 40, 4.4); // nom, prix, qte, gramme de sucre    
       Cocktail whisky_coca = new Cocktail("whisky-coca", 6.00); // nom, prix    
       whisky_coca.ajoutComposant(whisky);    
       whisky_coca.ajoutComposant(coca);    
       System.out.println(whisky_coca.affComposition());     
 }    
} 


Je souhaite afficher le nom de chaque composant du cocktail (whisky et coca) avec la méthode affComposition() mais actuellement ça me retourne le nom du cocktail (whisky-coca). Comment faire pour afficher le nom de chaque composant ?

Désolée je débute et j'ai encore du mal à comprendre l'objet.

Cordialement
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Je ne pense pas que ce soit vraiment une mauvaise compréhension de l'objet HashSet mais plus la manière dont tu as fait ta méthode.

Tu dis "je veux afficher le nom de chaque composant", ce qui correspond bien au System.out.println(it.next()); qui doit faire l'affichage correctement.

Et ensuite tu dis "ça me retourne le nom du cocktail", ce qui est une chose tout à fait différente, et parfaitement normal puisque tu fais return "Composants: "+nom;

La question est donc qu'est-ce que dois faire cette méthode ? Afficher, ou renvoyer un résultat ?
Si au lieu de faire System.out.println(whisky_coca.affComposition()); tu fais directement whisky_coca.affComposition(); tu devrais avoir directement ce que tu veux.

Remarque : plutôt que d'utiliser tes propres méthodes d'affichage, il vaut mieux surcharger la méthode toString, c'est beaucoup plus propre !
1
mfpresta13
 
Bonsoir,
Cette méthode doit retourner une chaine avec les composants du cocktail (whisky et coca).
Quand je met directement whisky_coca.affComposition(); sans le System.out.println j'obtiens ceci: BoissonNonAlcoolisee@2a9931f5
BoissonAlcoolisee@525483cd et c'est là que je ne vois pas à quoi ça correspond. Je veux juste que whisky et coca s'affichent. Mais je ne vois pas comment faire :(
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Ça c'est parce que tu fais System.out.println(it.next()); et que tu n'as pas redéfini la méthode toString dans la classe Boisson. Pour l'instant tu utilises le toString de Object qui donne "Classe@Reference"
Redéfinis les méthodes de la classe Object autant que possible (toString, equals, hashCode...)
0
mfpresta13
 
En effet ça fonctionne beaucoup mieux en redéfinissant la méthode toString :)
J'ai donc:
// Parcourt de la collection composition pour afficher les composants du cocktail
public String affComposition()
{
		Iterator<Boisson> it = composition.iterator();
		while (it.hasNext())
		{
			it.next();
		}
		return "Composants du "+this.nom+": "+composition;
}

Et il me retourne bien Composants du whisky-coca: [Composants non alcoolisés: coca, Composants alcoolisé: whisky].
Mais admettons que dans une autre méthode je veuille retourner cette fois ci la quantité de chaque composant du cocktail:
Coca: 40ml, Whisky: 40ml
private double qte()
	{
		Iterator<Boisson> it = composition.iterator();
		while (it.hasNext())
		{
			it.next();
		}
		return "Quantité de chaque composant du "+this.nom+": "+composition;
	}

Je ne peux pas faire 2 toString (un pour le nom et un pour la quantité) et je ne peux pas tout mettre (quantité, nom ...) dans le même toString étant donné que j'ai une méthode pour chaque attribut. Donc comment je peux faire pour "cibler" les attributs de mon HashSet composition ?
Je serai tenté de faire un
return "Quantité de "+this.nom+": "+composition.qte;
et un
return "Composants du "+this.nom+": "+composition.nom;
mais malheureusement ça ne fonctionne pas comme cela.
J'espère que je suis claire :$
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Le problème c'est que ton code ne fais pas ce que tu penses...
Nul part tu ne te sers de it.next, c'est comme si tu ne le mettais pas :

public String affComposition()
{
	return "Composants du "+nom+" : "+composition;
}

L'affichage "[Composants non alcoolisés: coca, Composants alcoolisé: whisky]" vient tout simplement de la méthode composition.toString(), en aucun cas tu n'as toi même décomposé le hashSet.

Voici une autre méthode qte(), qui décompose le hashSet pour en extraire les données :

public String double qte()
{
	StringBuilder sb = new StringBuilder("Quantité de chaque composant du ") .append(nom).append(" :");

	Iterator<Boisson> it = composition.iterator();
	while (it.hasNext())
	{
		Boisson b = it.next();
		sb.append(" ").append(b.nom()).append(b.qte());
	}

//	Remarque, je préfère cette écriture (plus claire)
//	for (Boisson b : composition)
//		sb.append(" ").append(b.nom()).append(b.qte());

	return sb.toString();
}

Remarque : ici qte() renvoit un String, ce qui peut poser un problème si la classe mère Boisson définit la méthode qte() comme renvoyant un double...
0
mfpresta13
 
Je ne connaissait pas StringBuilder c'est très utile. Merci beaucoup pour ton aide KX :)
Cordialement
0