Java HashMap put方法不起作用[重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

我试图用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();
    }
}
java hashmap
3个回答
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);

2
投票

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

containsValue()如果map将一个或多个键映射到指定值,则返回true

containsKey()如果map包含指定键的映射,则返回true

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


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.