HashMap containsKey()查询的输出未返回正确的值

时间:2019-01-27 11:25:39

标签: java hashmap entryset

程序将基于If语句打印错误的键和值。 有人可以解释为什么吗?

例如键=汤姆叔叔+值= 02086542222      键=哈里+值= 020826262

查询=汤姆叔叔

返回值=键=哈利+值= 00826262

以下文档状态中的报价:

“更正式地讲,当且仅当该映射包含键k的映射时返回true,这样(key == null?k == null:key.equals(k))”

因此,我的印象是 if(Contacts.containsKey(query))将使用 key.equals(k) 将输入查询与键进行比较>

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class HRHashMap {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan = new Scanner(System.in);

        Map<String, Integer> Contacts = new HashMap<String, Integer>();//Specify HashMap of type String

        int numOfContacts = scan.nextInt();
        scan.nextLine();

        //Add contacts
        for (int i = 0; i < numOfContacts; i++) {
            String contactName = scan.nextLine();
            int contactNumber = scan.nextInt();
            scan.nextLine();
            Contacts.put(contactName, contactNumber);
        }

        //Iterate over the Map
        for (Entry<String, Integer> entry : Contacts.entrySet()) {
            String query = scan.nextLine();
            if (Contacts.containsKey(query)) {
                //System.out.println(Contacts.get(query));
                System.out.println(entry.getKey() + "=" + entry.getValue());
            } else {
                System.out.println("Not found");
            }
        }

    }
}

2 个答案:

答案 0 :(得分:2)

您的程序遍历地图中的每个条目,为每个条目请求一些输入(query),然后检查query是否是地图中的键,是否打印当前访问过的键条目(与query完全无关)。

因此输出看起来是“正确的”:该地图确实包含“汤姆叔叔”,因此它将继续打印第一个条目(“哈利”)。请注意,“第一个”是HashMap中的一个模糊概念,条目的迭代顺序未指定。

我不太明白为什么要遍历所有条目,但是注释掉的行(打印匹配query的条目)可能会更好:

System.out.println(Contacts.get(query));

答案 1 :(得分:0)

尝试像这样使用在for循环中声明的入口变量

Scanner sc = new Scanner(System.in);

        Map<String, Integer> Contacts = new HashMap<>();

        while (sc.hasNext()) {
        String contactName = sc.nextLine();
        int contactNumber = sc.nextInt();
    sc.nextLine();
    Contacts.put(contactName, contactNumber);
    }

 for (Entry<String, Integer> entry : Contacts.entrySet()) {
while(sc.hasNext()) {
                if (entry.containsKey(sc.nextLine())) {
                    //System.out.println(Contacts.get(query));
                    System.out.println(entry.getKey() + "=" + entry.getValue());
                } else {
                    System.out.println("Not found");
                }
}
            }

希望有帮助。在for循环上使用entry变量,由于它是一个小程序,因此可以在Scanner上使用while循环。