Выходные данные из запроса HashMap containsKey () не возвращают правильное значение - PullRequest
0 голосов
/ 27 января 2019

Программа выведет неверный ключ и значение на основе оператора If.Может кто-нибудь объяснить, почему?

Например, Ключ = Дядя Том + Значение = 02086542222 Ключ = Гарри + Значение = 020826262

Запрос = Дядя Том

Возвращает = Ключ = Гарри + Значение= 00826262

Цитата из приведенной ниже документации гласит:

"Более формально, возвращает true, если и только если эта карта содержит отображение для ключа k такое, что (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 голосов
/ 27 января 2019

попробуйте использовать переменную ввода, объявленную в вашем цикле 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, и, поскольку это небольшая программа, вы можете использовать цикл while на сканере.

0 голосов
/ 27 января 2019

Ваша программа выполняет итерацию по каждой записи на карте, запрашивая некоторый ввод (query) для каждой записи, затем проверяет, является ли query ключом на карте и печатает ли текущую посещенную запись (которая является совершенно не связано с query).

Таким образом, вывод кажется «правильным»: карта содержит «Дядюшка Том», поэтому она начинает печатать первую запись («Гарри»). Обратите внимание, что «first» - это мутная концепция в HashMap, порядок итераций записей не указан.

Я не совсем понимаю, почему вы перебираете все записи, но закомментированная строка (которая печатает запись, соответствующую query) может работать лучше:

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