Parcourir hashtabe en java [Résolu/Fermé]

Signaler
Messages postés
11
Date d'inscription
samedi 13 septembre 2008
Statut
Membre
Dernière intervention
13 avril 2010
-
Messages postés
998
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
-
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 .

2 réponses

Messages postés
998
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
325
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60769 internautes nous ont dit merci ce mois-ci

Messages postés
109
Date d'inscription
dimanche 12 octobre 2008
Statut
Membre
Dernière intervention
2 juin 2011

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;
}
}

}
Messages postés
998
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
325 >
Messages postés
109
Date d'inscription
dimanche 12 octobre 2008
Statut
Membre
Dernière intervention
2 juin 2011

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,
Messages postés
998
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
325 >
Messages postés
998
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009

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
Messages postés
3924
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
8 octobre 2010
682
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.

++