我正在尝试使用PhoneBook
创建HashMap
但是,我发现我的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();
}
}
答案 0 :(得分:7)
您提供的名称是data.containsValue(name)
的关键,而不是值
如果您想根据班级客户端的密钥返回值,则需要Map.containskey()
。
请注意,不需要处理地图中的存在,因为返回null
因为没有关键字的映射:
public String getPhone(String name){
return data.get(name);
}
旁注
不是问题中的问题,而是要处理的问题
ToString()
对于方法来说真的不是一个好名字:
public void ToString(){
data.toString();
}
方法名称区分大小写,是的,但使用它来定义与T
方法略有不同的命名(这里是Object.toString()
大写)并不是一个公平的理由。它使代码阅读误导
此外,您的方法什么都不返回。所以这很无奈:pb.ToString();
你应该声明的是:
@Override
public String toString(){
return data.toString();
}
添加@Override
会添加一个编译约束,用于检查方法是否在层次结构中定义。
现在您可以通过这种方式在标准输出中写入toString()
对象的PhoneBook
表示:
System.out.println(pb);
答案 1 :(得分:2)
HashMap将键映射到值,因此它包含键值对。
containsValue()
如果地图将一个或多个键映射到指定的值
containsKey()
如果地图包含指定键的映射
您的案例的关键字为name
,值为num
。在方法getPhone()
中,您有与name
对应的参数,因此您应该使用containsKey()
代替containsValue()
答案 2 :(得分:1)
data.containsValue(name)
检查HashMap
是否包含值 name
。由于您的HashMap
包含名称键且数字值,因此您应该致电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);
}