【问题标题】:Method to find Key in HashTable在HashTable中查找Key的方法
【发布时间】:2009-02-26 12:19:00
【问题描述】:

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

编辑:从评论中复制

对不起,如果我没有说得更清楚,我正在尝试在 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

【问题讨论】:

  • 您要返回哪个键?到目前为止,您尝试过什么,以及它如何不起作用?请提供更多信息!
  • 你为什么要迭代它?它是一个哈希表,通过哈希进行查找...
  • 是的,它是一个地图,只需使用get之类的地图方法,不要浪费时间迭代它!此外,您不必迭代 INTERNAL 实现。你可以使用 Map.keys() 和 map.values()

标签: java hashtable loops


【解决方案1】:

给定示例数据(“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;
}

【讨论】:

    【解决方案2】:

    设置:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        对不起,如果我没有说得更清楚,我正在尝试在 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

        【讨论】:

          【解决方案5】:

          使用 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

          【讨论】:

            猜你喜欢
            • 2014-03-03
            • 2023-03-31
            • 2019-12-20
            • 2011-04-28
            • 1970-01-01
            • 2013-01-03
            • 1970-01-01
            • 2012-06-09
            • 1970-01-01
            相关资源
            最近更新 更多