Java HashMap put方法不起作用[重复]
Posted
技术标签:
【中文标题】Java HashMap put方法不起作用[重复]【英文标题】:Java HashMap put method isn't working [duplicate] 【发布时间】:2018-08-25 15:33:48 【问题描述】:我正在尝试使用HashMap
创建PhoneBook
。
但是我看到我的addPhone
方法不会将新手机添加到我的PhoneBook
pb
即data.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();
【问题讨论】:
【参考方案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 将一个或多个键映射到指定的 值
containsKey()
如果 map 包含指定 key
您的案例有 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);
【讨论】:
以上是关于Java HashMap put方法不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章