2009-02-26 95 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")); 

输出


黄油