0

程序将根据 If 语句打印不正确的键和值。有人可以解释为什么吗?

例如 Key = Uncle tom + Value = 02086542222 Key = Harry + Value = 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");
            }
        }

    }
}
4

2 回答 2

2

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

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

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

System.out.println(Contacts.get(query));
于 2019-01-27T11:32:17.460 回答
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 循环。

于 2019-01-27T13:24:31.500 回答