Выходные данные из запроса HashMap containsKey() не возвращают правильное значение

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

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

Query = Дядя Том

Возвращает = Ключ = Гарри + Значение = 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 ответа

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

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

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

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

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

Другие вопросы по тегам