Parcourir hashtabe en java

Résolu/Fermé
alaa16 Messages postés 11 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 13 avril 2010 - 18 sept. 2008 à 16:04
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 - 22 déc. 2008 à 15:16
Bonjour,
je veux parcourir une hashtable afin d'avoir aficher tous les elements.
j'ai essayé avec l'enumeration.Mais ça ne marche pas . car la resultats afiché n'est pas les elemenet de hashtable mais l'adresse memoire de ces element !!!

voila le code :

import java.util.*;
public class Roman {
/** Creates a new instance of Roman */
private String nomR;
private int noIsbR;
public Roman(String n, int i) {
this.nomR = n;
this.noIsbR = i;
}
public void setNomTitre(String n){
this.nomR = n;
}
public void setNoIsbn(int i){
this.noIsbR = i;
}
public String getNomTitre(){
return(this.nomR);
}
public static void main(String[] args) {
Hashtable h;
h = new Hashtable();
Roman livre = new Roman("A l'ouest...", 1);
h.put(1, livre);
livre = new Roman("A l'Est...", 2);
h.put(2, livre);
Enumeration e = h.elements();
while ( e.hasMoreElements()) {
System.out.println((Roman) e.nextElement());
}
}

}

voila la resultat :

Roman@187aeca
Roman@e48e1b

Process completed.
Mercie d'avance .
A voir également:

2 réponses

Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
18 sept. 2008 à 23:45
Bonsoir,
Juste pour compléter la très bonne réponse de Sandul, deux petits commentaires :

- Ta méthode est la bonne, mais utilise plutôt des itérateurs plutôt que des énumérations (l'API java le conseille : NOTE: The functionality of this interface is duplicated by the Iterator interface. In addition, Iterator adds an optional remove operation, and has shorter method names. New implementations should consider using Iterator in preference to Enumeration. )
Iterator<Roman> it = h.value().iterator();
while ( it.hasNext()) {
System.out.println(it.next());
}

- Deuxième conseil inutile : Utilise plutôt une HashMap qu'une Hashtable, pour des raisons de performances. La différence est que la hashtable est synchronized, donc dans le cas où ton application n'est pas multithreadée, et que tu n'as pas d'accès concurrents sur cet objet, utilise plutôt une HashMap. Dans le cas inverse, l'utilisation de la Hashtable est justifié, donc ne tiens pas compte de ce commentaire.

Bien cordialement,
1
saif87 Messages postés 109 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 2 juin 2011
22 déc. 2008 à 10:49
bonjour marco j'ai besoin de t'aide
réellement ce n'est pas un probleme j'ai implémenter ma classe hashtable1 a pour but de stocker des clients avec leur code mais mon probleme est dans la fonction affichage je veut qu'il affiche la cle avec les informations de l'objet client
donc mon probleme est d'afficher les cle comme par exemple cle=e de client =saif
merci
voila mon code
import java.util.*;
class Hashtable1
{
Hashtable m=new Hashtable();

public boolean remplirHash(String s,Client c)
{
if(!m.containsKey(s))
{
m.put(s,c);
return true;
}
else
{
System.out.println("cle deja utilise");
return false;
}

}
public void affichage()
{
Enumeration nb=m.elements();
System.out.println("l'ensemble des clients est ");
while(nb.hasMoreElements())
{
Object key=nb.nextElement();
Client value=(Client)m.get(key);
System.out.println("les informations sont "+key );

}
}
Client getClient(String cle)
{
if(m.containsKey(cle))
{
Client value=(Client)m.get(cle);
return value;
}
else
{
System.out.println("cle inexistante ");
return null;
}
}

}
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329 > saif87 Messages postés 109 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 2 juin 2011
22 déc. 2008 à 11:16
Bonjour,
J'ai cru voir passer ce post, et une personne t'avait aiguillée vers la surcharge de la méthode toString() si je me rappelle bien.

Voici comment c'est possible :
...
public void affichage() {
 Enumeration nb=m.elements();
 Object key;
 while(nb.hasMoreElements()) {
  key=nb.nextElement();
  Client value=(Client) m.get(key);
  System.out.println("cle = "+ key + "" + value.getName() );
 }
}
...

Avec bien sûr ta classe Client qui ressemble à ça :
class Client {
 private String name;

 public Client(String name) {
  this.name = name;
 }

 public String getName() {
  return name;
 }
}


Comme le disait ton autre interlocuteur, l'autres solution serait de surcharger la méthode toString() de Client (et surcharger aussi la méthode hashCode()). Avec ça, plus besoin de getName().

Cordialement,
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329 > Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009
22 déc. 2008 à 15:16
Edit : En fait ça ne sert à rien de redéfinir la méthode hashCode(). C'est quand on redéfinit equals() que c'est important. Pour toString(), ça ne sert à rien...

Décidément je dis pas mal de bêtises en ce moment moi...

Cordialement
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
18 sept. 2008 à 16:11
Salut,

C'est normal d'avoir ceci à la console, car tu as
System.out.println((Roman) e.nextElement());

==> le nextElement te retourne un objet de type Roman. Il y a deux solutions:
1. Tu remplaces ce que tu écris à la console par
System.out.println(((Roman) e.nextElement()).getNomTitre()); 

2. Ou bien tu rajoutes une méthode toString() à la classe Roman pour lui dire ce qu'elle doit écrire lorsque l'on lui demande de s'imprimer. La méthode toString pourrait retourner par exemple ce que getNomTitre() retourne à présent. Si tu rajoutes toString(), il n'est plus nécessaire de modifier le System.out.prinltn.

++
-1