Hashtable : plusieurs valeurs pour une clé ?

Fermé
lesly78 - 23 nov. 2011 à 19:24
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 24 nov. 2011 à 17:14
Bonjour,

en Java, dans un hashtable, je stocke deux valeurs pour une meme clé :
monHashtable.put("maCle", 1);
monHashtable.put("maCle", 2);

Comment, à partir de la clé, puis-je lister toutes les valeurs correspondantes ? Je n'arrive qu'à retourner une valeur avec :
monHashtable.get("maCle");
//retourne 1

J'aimerais pouvoir vérifier s'il y a plusieurs valeurs, et si c'est le cas, les retourner. Pourriez-vous me venir en aide ?

merci beaucoup !

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 nov. 2011 à 20:16
En effet put efface la valeur précédente si la clé est la même. Et pour info, la valeur que retourne la méthode correspond à la valeur précédemment stockée.

Remarque : à part si tu utilises des Threads et que tu as besoin d'avoir des données synchronisées, je te conseilles d'utiliser HashMap, qui fait exactement pareil que Hashtable à part qu'elle est non-synchronisée donc il y a moins de contrôle et c'est plus rapide ;-)

Si tu veux avoir plusieurs valeurs pour une même clé, tu peux utiliser des Collection imbriquées, ce sera bien mieux qu'utiliser des tableaux.
Par exemple : HashMap<String,HashSet<Integer>>, HashMap<String,LinkedList<Integer>>
Le choix de la Collection est important du point de vue de l'efficacité, mais il faut savoir ce que font chacune et adapter à ton problème...
1
Merci beaucoup pour votre aide, je vais chercher un peu plus loin du côté de ces structures de données :) Je ne comprends pas ce que sont des Threads mais je vais plancher un peu, et je ne comprends pas non plus ce que vous appelez par "non syncronisée" ^^

En voulant tourner le problème d'un autre coté, j'ai décidé de stocker un entier (qui sera unique donc autant le mettre en clef), et une chaine de caractère dans mon hashtable :

monHashtable.put(1,"maString1");
monHashtable.put(7,"maString3");

Dans mon algorithme, j'ai besoin de récupérer la clé qui correspond à mon String. Je n'ai trouvé que cette méthode pour y parvenir : je liste tout le hashtable, et si la valeur en cours correspond à ma String, je note la clé (ce qui est catastrophiquement intolérable du point de vue de la complexité).

Je suppose qu'il n'y a aucun moyen de trouver la clé qui correspond à une valeur ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 nov. 2011 à 17:14
Si tu ne sais pas ce que sont des Thread ou la synchronisation, alors c'est que tu peux remplacer Hashtable par HashMap sans souci ^^

Si tu as besoin de récupérer la clé qui correspond à ton String, c'est que tu t'es trompé et que la clé c'est le String et non la valeur. Après rien ne t'empêche d'avoir deux HashMap, l'une <Integer,String> et l'autre <String,Integer>. Il faudrait savoir ce que tu veux faire exactement...
0
en fait je pense que le deuxième "put" écrase le premier... dites moi si je vise juste, merci ;)

dans ce cas là, il vaudrait mieux ne pas stocker un <String, Integer> mais un String avec un tableau d'entiers ?
0