Hashtable : plusieurs valeurs pour une clé ?

lesly78 -  
KX Messages postés 19031 Statut Modérateur -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
    1. lesly78
       
      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
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
  2. lesly78
     
    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