2

我正在尝试创建一个迭代哈希表并将键作为字符串返回的方法,最好的方法是什么?

编辑:从评论中复制

抱歉,如果我没有说得更清楚,我正在尝试在 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());
    }
}

它输出

黄油 50
豆类 40

我创建了一个查找键并返回值的方法

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

当我寻找 Butter 它返回 50 当我寻找 Beans 它返回 50

4

5 回答 5

9

给定示例数据(“Butter”,“Beans”),这似乎是家庭作业......

在您的示例中, findValue 每次都返回地图/表中的第一个键。您甚至没有使用您输入的密钥(名称)。这是一个解决您的问题的示例,认为您以错误的方式使用地图。

一个更好的方法来做到这一点:

// 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;
}
于 2009-02-26T15:59:54.583 回答
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));
于 2009-02-26T12:31:23.087 回答
1

查看第二段代码,您实际上并没有在任何地方使用 Name 参数。所以发生的事情是,第一次循环时,条目的值被返回——第一个值恰好是 50。

您需要检查条目的键是否实际上等于您要查找的名称...

于 2009-02-26T16:45:48.187 回答
0

使用 for 循环按值获取键是不省时的!!而且您不会从 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"));

输出


黄油

50

于 2012-01-13T15:34:26.933 回答
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;
}

当我寻找 Butter 它返回 50 当我寻找 Beans 它返回 50

于 2009-02-26T12:40:32.160 回答