Выходные данные из запроса 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 на сканере.