Parcourir hashtabe en java

Résolu
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 .
Configuration: Windows XP
Internet Explorer 6.0

2 réponses

  1. 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
    1. Contributeur
      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
      1. 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
      2. Contributeur
        @saif87Bonjour,
        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
      3. Contributeur
        @Marco la baraqueEdit : 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