Display d'un hashmap?

Statut
N'est pas ouverte pour d'autres réponses.

Skarbone

Le méchant Ω
Salut tout le monde :)

Voila, dernier problème pour mon projet de java...

Je vois parcourir une HashMap<String,Article>

Et utiliser ceci pour faire une méthode qui, pour chaque Article, écrit genre

article.x = article.y (x et y sont des attributs dans ma classe Article)

Comment faire cela? pour l'instant j'ai essayé

public void display(){
Set clef = new HashSet();
Iterator ite = clef.iterator();
while(ite.hasNext()){
System.out.println("le memo "+ite.next().getMnemonic()+" correspond à "+ite.next().getDescription());
}
}


et


public void display(){
Set cle = new HashSet();
Iterator ite = cle.iterator();
while(ite.hasNext()){

System.out.println(ite.next());
}


}


La premiere ne compile même pas, la deuxieme compile mais ne fonctionne pas (rien ne s'écrit quand je l'appelle

Merci d'avance ^^
 

Jereck

Α & Ω
Staff
ite.next() te renvoie quoi ? (vu qu'il est dans ton println() )

(pfff, en C#, je pourrai t'aider avec un foreach ^^ )
 
1er
OP
Skarbone

Skarbone

Le méchant Ω
a vrai dire, aucune idée =D

en principe il est censé me retourner le prochain Objet
 

Jereck

Α & Ω
Staff
ouais, mais tous les "Object" ne sont pas affichables.

Tu dois faire un cast avant ...
 
1er
OP
Skarbone

Skarbone

Le méchant Ω
ouais, mais tous les "Object" ne sont pas affichables.

Tu dois faire un cast avant ...
oui, mais le prochain objet est un Article en fait, qui a comme attributs 2 strings, donc dans mon second code, j'essaye de récuperer chacun de ces attributs, malheureusement ca ne marche pas =+
 

Jereck

Α & Ω
Staff
Il n'y a de casting nulle part dans tes codes ...
 
1er
OP
Skarbone

Skarbone

Le méchant Ω
je comprend pas pourquoi j'aurais besoin d'un casting?
 
a vrai dire, aucune idée =D

en principe il est censé me retourner le prochain Objet
C'est là le problème.
Ton itérateur va te renvoyer des objets, et tu ne peux pas afficher un objet, donc il faut encore que tu envoies "demande" à l'objet (via la méthode appropriée) afin de pouvoir l'afficher
a
(d'ailleurs tu sembles le faire correctement dans ta première implémentation) :

System.out.println("le memo "+ite.next().getMnemonic()+" correspond à "+ite.next().getDescription());

Par contre cette ligne de code à un gros défaut, n'oublie pas que dans un itérateur au sens de Java (si je ne me trompe pas), chaque fois que tu appelles la méthode next(), à son prochain appel, elle appellera l'objet suivant ...

Donc ici tu risque d'afficher le Mnemonic de l'objet 1, puis la description de l'objet 2, et ainsi de suite ... Si tu veux utiliser deux fois le même objet, tu dois alors en stocker une référence dans une variable temporaire ;)

Donc selon moi la solution se situe entre les deux implémentation que tu as écrites :

Je peux t'écrire le code mais il me manque le type d'objets stockés par défaut dans ton HashSet pour pouvoir définir la variable temporaire ... (enfin normalement j'ai plus fait de JAVA depuis 1 ans et j'en ai fait que 6 mois mais je me débrouille plus que bien :) )

Ensuite, vérifie aussi que le constructeur par défaut place bien des valeurs dans ton HashSet, sinon il est logique que tu n'arrives à rien afficher, simplement parce qu'il n'y a rien dedans !


( screugneugneu, les balises CODE \CODE manquent cruellement :beuh: )
 
ouais, mais tous les "Object" ne sont pas affichables.

Tu dois faire un cast avant ...
Wouaw c'est violent de faire un casting comme ça part défaut c'est quand même mieux d'implémenter de petites méthodes supplémentaires et en plus c'est beaucoup plus propre et plus OO !
 

Jereck

Α & Ω
Staff
comment ça ?

Article machin = (Article) ite.next();

Ensuite, tu utilises les accesseurs de la classe Article, puisque "machin" est un objet Article ...
 
1er
OP
Skarbone

Skarbone

Le méchant Ω
comment ça ?

Article machin = (Article) ite.next();

Ensuite, tu utilises les accesseurs de la classe Article, puisque "machin" est un objet Article ...
effectivement je viens d'essayer, ca marche.

Mais je comprend pas pourquoi je dois le caster, alors que ite.next() est censé me renvoyer le truc suivant, et que le truc suivant est un Article ^^
 

Jereck

Α & Ω
Staff
Quoique, c'est une HashMap typée, donc, en effet le casting est inutile.
Edit : Une itérateur sur une liste typée renvoie quel type d'objet ? Un Object, ou un T ?

Par contre, ton objet Article n'est pas affichable en direct dans ton println() !

Tu dois créer une méthode ToString() ou utiliser un accesseur qui te renvoie un string !
 
1er
OP
Skarbone

Skarbone

Le méchant Ω
Quoique, c'est une HashMap typée, donc, en effet le casting est inutile.
Edit : Une itérateur sur une liste typée renvoie quel type d'objet ? Un Object, ou un T ?

Par contre, ton objet Article n'est pas affichable en direct dans ton println() !

Tu dois créer une méthode ToString() ou utiliser un accesseur qui te renvoie un string !
Ces deux accesseurs sont déja fait, j'ai d"ailleurs essayé de les utiliser la:

System.out.println("le memo "+ite.next().getMnemonic()+" correspond à "+ite.next().getDescription());


En effet, les deux attributs mnemonic et description sont des string
 
En effet un itérateur respecte normalement l'Interface (au sens de Java) Iterator et cette interface est définie pour différents types d'objets dont on ne connait a priori pas les composants ;)
 

Jereck

Α & Ω
Staff
Mais dans ce bout de code-là
a) cfr remarque de Largo sur l'utilisation de next()
b) Si next() renvoie un Object et pas un T (dans ce cas, un Article), tu tente d'accéder à des accesseurs qui n'existent pas (pour Object) d'où l'erreur de compilation
 
1er
OP
Skarbone

Skarbone

Le méchant Ω
public void display(){
Set clef = new HashSet();
Iterator ite = clef.iterator();
while(ite.hasNext()){
Article monArticle = (Article) ite.next();
System.out.println("le memo "+monArticle.getMnemonic()+" correspond à "+monArticle.getDescription());
}
}

voila au final ce que j'ai fait (et qui marche)
 
C'est normal que ça marche ... ça rassemble tous les conseils qu'on vient de donner :-D
 
1er
OP
Skarbone

Skarbone

Le méchant Ω
^^

Par contre maintenant quand j'essaye d'afficher ca, il me dit que le fichier existe pas :-(

(alors qu'il existe et que je peux l'employer :/)
 

Jereck

Α & Ω
Staff
et donc, avec un foreach et en DotNET

// Déclaration du HashSet

public void display(){
....foreach (Article monArticle in cle){
........Console.PrintLine ("le memo "+ monArticle.Mnemonic + " correspond à " + monArticle.Description);
....}
}
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut