程序将基于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");
}
}
}
}
答案 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循环。