2009-02-26 97 views
1

我試圖創建一個迭代通過哈希表的方法,並將該密鑰返回爲字符串,最好的方法是什麼?在HashTable中查找密鑰的方法

編輯:從評論

對不起復制,如果我沒能更清晰,我試圖做到這一點在Java中。我創建了一個測試類

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()); 
    } 
} 

它輸出

 
Butter 50 
Beans 40 

我已經創建了尋找一個鍵和返回值

public Object findValue(String Name){ 
    for (Object o: hashMap.entrySet()) { 
     Map.Entry entry = (Map.Entry) o; 
     return entry.getValue(); 
    } 
    return null; 
} 
當我尋找黃油

的方法它返回50當我尋找豆它返回50

+0

你想要哪個鍵返回?到目前爲止你嘗試過什麼,它是如何工作的?請提供更多信息! – 2009-02-26 12:21:45

+1

你爲什麼要重複它?這是一個哈希表,查找通過哈希執行... – 2009-02-26 12:22:29

回答

4

設置:

final Object sentinal = new Object(); 


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

給定一個鍵,找到一個值(查找):

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

給定值時,發現它的鍵(反向查找):

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

......不過,如果我必須經常進行反向查詢,我一般會建立一個反向映射:

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

對不起,如果我沒有,讓它更加清晰,我試圖用Java來做到這一點。 我創建了一個測試類

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()); 
    } 
} 

它輸出

Butter 50 
Beans 40 

我已經創建了尋找一個鍵和返回值

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

的方法黃油它返回50當我尋找豆它返回50

7

似乎像家庭作業給n示例數據(「Butter」,「Beans」)...

在您的示例中,findValue每次都會在map/table中返回FIRST KEY。您甚至沒有使用您所使用的密鑰(名稱)。下面是一個修復您的問題的例子,認爲您以錯誤的方式使用地圖。

更好的方式來做到這一點:

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

你的榜樣,固定:

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

在你的代碼片段二看,你不實際使用的名稱參數的任何地方。所以發生的一件事是,第一次圍繞循環,條目的值被返回 - 第一個值恰好爲50。

您需要檢查項的鍵是否實際上等於你正在尋找...

0

使用的循環度日價值的關鍵不是時間effecient的名字!並且您不從HashTable中受益。

因此,既然你想使用散列表進行直線反向迴歸,你可以使用兩個散列表。 表1(鍵,值)表2(值,鍵)

//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")); 

輸出


黃油