我试图做一个练习,创建一个 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();
}
}
最佳答案
您提供的名称是 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);
关于Java HashMap put 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49322906/