2009-02-26 8 views
1

J'essaie de créer une méthode qui itère à travers une hashtable et retourne la clé sous forme de chaîne, quelle est la meilleure façon d'y parvenir?Méthode pour trouver Key dans HashTable

EDIT: copié de commentaire

Désolé si je ne le rendre plus clair, je suis en train de le faire en Java. J'ai créé une classe de test

public void runprog() { 
    hashMap.put("Butter", 50); 
    hashMap.put("Beans", 40); 
    for (Object o: hashMap.entrySet()) { 
     Map.Entry entry = (Map.Entry) o; 
     System.out.println(entry.getKey() + " " + entry.getValue()); 
    } 
} 

il émet

 
Butter 50 
Beans 40 

J'ai créé une méthode qui recherche une clé et retourne la valeur

public Object findValue(String Name){ 
    for (Object o: hashMap.entrySet()) { 
     Map.Entry entry = (Map.Entry) o; 
     return entry.getValue(); 
    } 
    return null; 
} 

quand je cherche le beurre il retourne 50 quand je cherche des haricots il retourne 50

+0

Quelle touche voulez-vous revenir? Qu'avez-vous essayé jusqu'à présent, et comment cela ne fonctionne-t-il pas? Plus d'infos, s'il vous plaît! –

+1

Pourquoi faites-vous des itérations? C'est une table de hachage, les recherches sont effectuées par hachage ... –

+0

S'il vous plaît élaborer plus. –

Répondre

4

Mettre en place:

final Object sentinal = new Object(); 


    Map<String, Object> map = new HashMap<String, Object>(){{ 
     put("key1", new Object()); 
     put("key2", sentinal); 
    }}; 

donné une clé, trouver une valeur (recherche):

System.out.println(map.get("key2") == sentinal); 

une valeur donnée, trouver est la clé (recherche inversée):

for(Map.Entry<String, Object> entry : map.entrySet()){ 
     if(entry.getValue() == sentinal){ 
      System.out.println(entry.getKey()); 
     } 
    } 

... mais, si je avoir à faire des recherches inversées régulières, je construis généralement une carte inverse:

Map<Object, String> reverse = new HashMap<Object, String>(); 
    for(Map.Entry<String, Object> entry : map.entrySet()){ 
     reverse.put(entry.getValue(), entry.getKey()); 
    } 
    System.out.println(reverse.get(sentinal)); 
0

Désolé si je didn ' Pour le rendre plus clair, j'essaye de le faire en Java. J'ai créé une classe de test

public void runprog() { 
    hashMap.put("Butter", 50); 
    hashMap.put("Beans", 40); 
    for (Object o: hashMap.entrySet()) { 
     Map.Entry entry = (Map.Entry) o; 
     System.out.println(entry.getKey() + " " + entry.getValue()); 
    } 
} 

il émet

Butter 50 
Beans 40 

J'ai créé une méthode qui recherche une clé et retourne la valeur

public Object findValue(String Name){ 
    for (Object o: hashMap.entrySet()) { 
     Map.Entry entry = (Map.Entry) o; 
     return entry.getValue(); 
    } 
    return null; 
} 

quand je cherche Beurre il retourne 50 quand je cherche des haricots il revient 50

+0

Je ne comprends toujours pas ce que vous essayez d'atteindre ... – pgras

7

On dirait que les devoirs donnent n les données d'exemple ("Butter", "Beans") ...

Dans votre exemple, findValue renvoie la PREMIÈRE CLÉ dans la carte/table à chaque fois. Vous n'utilisez même pas la clé (nom) dans laquelle vous avez inséré votre code. Voici un exemple qui corrige votre problème, vous pensiez que vous utilisiez des cartes dans le mauvais sens.

une meilleure façon de le faire:

// assume Name is your key, ex. "Butter" 
// No need to iterate since maps are designed for lookup 
Object value = map.get(Name); 

votre exemple, fixe:

public Object findValue(String Name){ 
    for (Object o: hashMap.entrySet()) { 
     Map.Entry entry = (Map.Entry) o; 

     // THIS IS THE IMPORTANT LINE 
     if(entry.getKey().equals(Name)) 
     { 
      return entry.getValue(); 
     } 
    } 
    return null; 
} 
1

En regardant votre deuxième extrait de code, vous n'êtes pas réellement utiliser le paramètre Name partout. Donc, ce qui se passe est que la première fois autour de la boucle, la valeur de l'entrée est retournée - et la première valeur arrive à être 50.

Vous devez vérifier si la clé de l'entrée est égale à fait le nom que vous cherchez ...

0

Utilisation de boucle pour obtenir la clé de valeur est pas le temps effecient !! et vous ne bénéficiez pas de HashTable.

Donc, puisque vous voulez utiliser pour Hashtable droite et arrière retrival vous pouvez utiliser deux tables de hachage. Tableau 1 (clé, valeur) Tableau 2 (valeur clé)

//Table1 
hashtable1.put("Butter", 50); 
hashtable1.put("Beans", 40); 

//Table2 
hashtable2.put(50, "Butter"); 
hashtable2.put(40, "Beans"); 

//Retrieving by key 
System.out.println(hashtable1.get(50)); 

//Retrieving by value 
System.out.println(hashtable2.get("Butter")); 

Sortie


Beurre