Probleme hashtable
Résolu
saif87
Messages postés
109
Date d'inscription
Statut
Membre
Dernière intervention
-
saif87 Messages postés 109 Date d'inscription Statut Membre Dernière intervention -
saif87 Messages postés 109 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je veut comprendre le hashtable pour cela j'ai fait un programme de gestion bancaire mais le problemme que le tableau de hashage me donne une seul valeur malgré qu 'il plusieur aidez moi svp
merci
voici le code il y'a 3 objet clients
import java.util.*;
class Hashtable1
{
Hashtable m;
Enumeration nb;
public void remplirHash(String s,Client c)
{
m=new Hashtable();
m.put(s,c);
}
public void affichage()
{
System.out.println("l'ensemble des clients est ");
while(nb.hasMoreElements())
{
Object key=nb.nextElement();
Object value=m.get(key);
System.out.println("la cle est "+key+ "la valeur est "+value);
}
}
}
class MainProjet
{
public static void main(String[] args)
{
System.out.println("entrer votre cin");
int cin=Clavier.lireInt();
System.out.println("entrer votre nom");
String nom=Clavier.lireString();
System.out.println("entrer votre prenom");
String pre=Clavier.lireString();
System.out.println("entrer votre tel");
int tel=Clavier.lireInt();
System.out.println("entrer votre solde initiale");
double s=Clavier.lireDouble();
CompteCourant cpt=new CompteCourant(s);
Client c=new Client(nom,pre,cin,tel);
c.setCompte(cpt);
System.out.println(c);
Hashtable1 h=new Hashtable1();
String cle=Clavier.lireString();
h.remplirHash(cle,c);
h.affichage();
h.remplirHash("q",c);
h.affichage();
h.remplirHash("x",c);
h.affichage();
}
}
je veut comprendre le hashtable pour cela j'ai fait un programme de gestion bancaire mais le problemme que le tableau de hashage me donne une seul valeur malgré qu 'il plusieur aidez moi svp
merci
voici le code il y'a 3 objet clients
import java.util.*;
class Hashtable1
{
Hashtable m;
Enumeration nb;
public void remplirHash(String s,Client c)
{
m=new Hashtable();
m.put(s,c);
}
public void affichage()
{
System.out.println("l'ensemble des clients est ");
while(nb.hasMoreElements())
{
Object key=nb.nextElement();
Object value=m.get(key);
System.out.println("la cle est "+key+ "la valeur est "+value);
}
}
}
class MainProjet
{
public static void main(String[] args)
{
System.out.println("entrer votre cin");
int cin=Clavier.lireInt();
System.out.println("entrer votre nom");
String nom=Clavier.lireString();
System.out.println("entrer votre prenom");
String pre=Clavier.lireString();
System.out.println("entrer votre tel");
int tel=Clavier.lireInt();
System.out.println("entrer votre solde initiale");
double s=Clavier.lireDouble();
CompteCourant cpt=new CompteCourant(s);
Client c=new Client(nom,pre,cin,tel);
c.setCompte(cpt);
System.out.println(c);
Hashtable1 h=new Hashtable1();
String cle=Clavier.lireString();
h.remplirHash(cle,c);
h.affichage();
h.remplirHash("q",c);
h.affichage();
h.remplirHash("x",c);
h.affichage();
}
}
1 réponse
Bonsoir Saif87,
Voici la correction :
Le problème venait du fait qu'à chaque fois que tu fais appel à remplirHash, tu crées une nouvelle instance de hashtable dans laquelle tu stockes la nouvelle valeur (mais toutes les anciennes sont perdues vu qu'elles appartenaient aux anciennes hashtable).
Cordialement,
ps: si tu n'utilises pas de threads dans ton application, il est préférable d'utiliser des hashmap plutôt que des hashtable (qui sont synchronized donc plus gourmandes en ressources).
Voici la correction :
class Hashtable1 { Hashtable m = new Hashtable(); Enumeration nb; public void remplirHash(String s,Client c) { m.put(s,c); } public void affichage() { System.out.println("l'ensemble des clients est "); while(nb.hasMoreElements()) { Object key=nb.nextElement(); Object value=m.get(key); System.out.println("la cle est "+key+ "la valeur est "+value); } } }
Le problème venait du fait qu'à chaque fois que tu fais appel à remplirHash, tu crées une nouvelle instance de hashtable dans laquelle tu stockes la nouvelle valeur (mais toutes les anciennes sont perdues vu qu'elles appartenaient aux anciennes hashtable).
Cordialement,
ps: si tu n'utilises pas de threads dans ton application, il est préférable d'utiliser des hashmap plutôt que des hashtable (qui sont synchronized donc plus gourmandes en ressources).
j'ai une petite question je veux dans l'affichage a coter des informations du client lui afficher les clé qui lui été attribuer exemple:
la clé Marco puis l'ensemble d'informations qui lui sont attribuer.
ce code affiche les informations mais a la fin value=null.
import java.util.*;
class Hashtable1
{
Hashtable m=new Hashtable();
public void remplirHash(String s,Client c)
{
m.put(s,c);
}
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 +value);
}
}
}
A propos de suggestion de tarvaillez avec hashmap il est un projet d'education et le prof nous oblige a travailler avec la table de hashage
Merci
Pour ton problème de value=null, en principe il n'y a pas de problème justement. Vérifie donc bien que tu ne fais pas un m.put(s, c); avec un objet c null (pour moi c'est la seule explication possible).
Quant à la discussion hashmap/hashtable, tout dépend de ce que ton professeur a demandé.
S'il a dit "utilisez la classe hashtable", ok. Par contre, s'il a dit "utilisez une table de hachage", la hashmap peut parfaitement faire l'affaire (hashmap et hashtable sont tous les deux des implémentation d'une table de hachage). A toi de voir ce qu'il y a de plus approprié.
Cordialement,
Merci de m'aider.
j'ai compris la faute.
est ce que je peut faire une recherche dans cette table de hashage a partir du cle c'a dire l'utilisateur donne une cle est je recherche pour afficher les informations concernant cette clé
Merci
C'est à ça que sert une table de hachage justement! Tu donnes la clé de ton élément, et tu le récupères en temps (quasi)constant.
C'est d'ailleurs ce que tu fais ici : Client value=(Client) m.get(key);
Par contre justement, en ce qui concerne ta méthode d'affichage, si tu ne veux pas afficher les clés, ça ne sert à rien de passer par l'énumération des clés (ça marche mais tu perds légèrement en performance). Vu que l'ensemble des valeurs est une Collection, tu peux la parcourir directement :
Cordialement,
voila la méthode de récupération d'objet client
Client getClient(String cle)
{
Client value=(Client)m.get(cle);
return value;
}
Merci de m'offrir cette idée.