【问题标题】:Java HashMap put method isn't working [duplicate]Java HashMap put方法不起作用[重复]
【发布时间】:2018-08-25 15:33:48
【问题描述】:

我正在尝试使用HashMap 创建PhoneBook
但是我看到我的addPhone 方法不会将新手机添加到我的PhoneBook pbdata.put(name, num); 我的addPhone 中的方法不会将数据放入HashMap data

谁能解释一下这里出了什么问题?

UPD 现在我明白这是一个错误,我使用了containsValue 方法而不是containsKey。如此简单!
但是这个问题与建议的已经存在的问题完全不同。我不是在问Is checking for key existence in HashMap always necessary? 我知道根据键或值搜索HashMap 的方法。这个问题实际上是由一个错误引起的。但是,我在这里收到了非常广泛且有用的答案。我相信这些答案,尤其是 davidxxx 的答案非常好,可能对很多人有用。

import java.util.HashMap;


public class PhoneBook {

        private HashMap<String, String> data;

        public PhoneBook() 
        { 
            data = new HashMap<String, String>(); 
        } 
        public void addPhone(String name, String num) 
        { 
            data.put(name, num); 
        }


        //a
        public String getPhone(String name){
            if(data.containsValue(name)){
                return data.get(name);
            }
            else 
                return null;
        }

        //b
        public void ToString(){
            data.toString();
        }

        public static void main(String[] args) {

            PhoneBook pb = new PhoneBook();
            pb.addPhone("shlomi", "12312413yuioyuio24");
            pb.addPhone("shlomi1", "1231345345241324");
            pb.addPhone("shlomi2", "12312445735671324");
            System.out.println(pb.getPhone("shlomi"));
            System.out.println(pb.getPhone("blat"));
            pb.ToString();
    }
}

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    您提供作为data.containsValue(name) 键的名称而不是值。
    如果您想根据类客户端的键返回值,您需要的是Map.containskey()

    请注意,不需要处理映射中的存在,因为返回了 null,因为键不存在映射:

    public String getPhone(String name){       
         return data.get(name);      
    }
    

    旁注

    不是问题中的问题,而是要处理的任何问题。
    ToString() 对于方法来说确实不是一个好名字:

    public void ToString(){
        data.toString();
    }
    

    方法名称是区分大小写的,是的,但是定义与Object.toString() 方法略有不同的命名(这里是T 大写)并不是一个公平的理由。它使代码阅读具有误导性。
    此外,您的方法什么也不返回。所以这很无奈:pb.ToString();

    你应该声明的是:

    @Override
    public String toString(){
        return data.toString();
    }
    

    添加@Override 会添加一个编译约束,以检查该方法是否在层次结构中定义。

    现在您可以例如在标准输出中以这种方式写入您的PhoneBook 对象的toString() 表示:

    System.out.println(pb);
    

    【讨论】:

    • @Eliyahu 不客气 :) 我添加了一个额外的示例来使用客户端的 toString(),因为如果您不利用返回的字符串,仅调用 pb.ToString() 仍然无用。
    【解决方案2】:

    HashMap 将键映射到值,因此它包含键值对。

    containsValue() 如果 map 将一个或多个键映射到指定的

    ,则返回 true

    containsKey() 如果 map 包含指定 key

    的映射,则返回 true

    您的案例有 name 作为键和 num 作为值。在getPhone() 方法中,您有对应于name 的参数,因此您应该使用containsKey() 而不是containsValue()

    【讨论】:

      【解决方案3】:

      data.containsValue(name) 检查HashMap 是否包含 name。由于您的 HashMap 包含名称 keys 和数字 values,因此您应该调用 data.containsKey(name)

      public String getPhone(String name){
          if(data.containsKey(name)) {
              return data.get(name);
          } else 
              return null;
      }
      

      或者干脆

      public String getPhone(String name) {
          return data.get(name);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        相关资源
        最近更新 更多