如何访问 Hashmap 的键并将它们与预定值进行比较?
How to access the keys of a Hashmap and compare them with a predetermined value?
我有这个哈希图:
HashMap<String, Student> students = new HashMap<String, Student>();
从用户输入 (sNo, name) 中获取 2 个字符串值后,我已经能够将它们放入 hashmap 中:
students.put(sNo, new Student(sNo, name));
我的问题是,每次我 运行 通过这个过程时,我都希望能够检查 Hashmap 键以确保输入的 sNo 与之前使用的不同。
我试过if(sNo == students.keySet())
,但没用。
你所做的是比较 5 (sNo) 是否与对象 (keySet()) 相同。您将永远无法满足此条件。您正在寻找的是查询 keySet 是否包含您的 sNo 值。
if (students.keySet().has(sNo))
地图为此提供了快捷方式:
if (students.containsKey(sNo))
此外,作为旁注,在 Java 中,我们这样写:
Map<Integer, Student> students = new HashMap<>();
上面的代码告诉我们,students变量是一个以Integer为键,Student为值的Map。实际的地图实现是未知的,你不应该真正关心它。然后创建一个 HashMap,它是 Map 接口的实际实现,并使用所谓的菱形运算符 <> 告诉编译器键和值与变量声明中的键和值相同。
您必须使用循环来与哈希图中当前的所有键进行比较,一次一个。这样你就可以将 sNo 与 key1 进行比较,然后将 sNo 与 key2 进行比较,等等。你现在尝试的方式,
(sNo == students.keySet())
尝试将一个键与整组键进行比较,这对计算机来说没有意义。当您比较 "things" 时,两个 "things" 需要是同一类型,在本例中为 "String"。循环的语法是
for(String s: students.keySet()){
//body
}
这个 for 循环的意思是 "for EACH string in the keyset...(body: compare sNo with s)" 然后在主体内部进行比较。
重要!:您不应该将字符串与“==”进行比较,您应该将它们与.equals() 进行比较。例如,不要做
if(sNo == s)
而是
if(sNo.equals(s))
如果您想知道我从哪里得到 s,请查看 for 循环内部。对于键集中的每个字符串,它被分配给 s 变量。现在您有了 for 循环,将键集中的每个字符串与您当前的键 sNo 进行比较。
如果你只是想在插入时确保密钥不在 HashMap
中,你可以使用 putIfAbsent(K key, V value)
方法:
Student s = students.putIfAbsent(sNo, new Student(sNo, name));
如果该条目已经存在,则由该方法返回,否则该方法将该条目插入映射中并且 returns null
:
if (s != null) {
System.out.println("Student "+s.getSno()+" already exists");
}
我有这个哈希图:
HashMap<String, Student> students = new HashMap<String, Student>();
从用户输入 (sNo, name) 中获取 2 个字符串值后,我已经能够将它们放入 hashmap 中:
students.put(sNo, new Student(sNo, name));
我的问题是,每次我 运行 通过这个过程时,我都希望能够检查 Hashmap 键以确保输入的 sNo 与之前使用的不同。
我试过if(sNo == students.keySet())
,但没用。
你所做的是比较 5 (sNo) 是否与对象 (keySet()) 相同。您将永远无法满足此条件。您正在寻找的是查询 keySet 是否包含您的 sNo 值。
if (students.keySet().has(sNo))
地图为此提供了快捷方式:
if (students.containsKey(sNo))
此外,作为旁注,在 Java 中,我们这样写:
Map<Integer, Student> students = new HashMap<>();
上面的代码告诉我们,students变量是一个以Integer为键,Student为值的Map。实际的地图实现是未知的,你不应该真正关心它。然后创建一个 HashMap,它是 Map 接口的实际实现,并使用所谓的菱形运算符 <> 告诉编译器键和值与变量声明中的键和值相同。
您必须使用循环来与哈希图中当前的所有键进行比较,一次一个。这样你就可以将 sNo 与 key1 进行比较,然后将 sNo 与 key2 进行比较,等等。你现在尝试的方式,
(sNo == students.keySet())
尝试将一个键与整组键进行比较,这对计算机来说没有意义。当您比较 "things" 时,两个 "things" 需要是同一类型,在本例中为 "String"。循环的语法是
for(String s: students.keySet()){
//body
}
这个 for 循环的意思是 "for EACH string in the keyset...(body: compare sNo with s)" 然后在主体内部进行比较。
重要!:您不应该将字符串与“==”进行比较,您应该将它们与.equals() 进行比较。例如,不要做
if(sNo == s)
而是
if(sNo.equals(s))
如果您想知道我从哪里得到 s,请查看 for 循环内部。对于键集中的每个字符串,它被分配给 s 变量。现在您有了 for 循环,将键集中的每个字符串与您当前的键 sNo 进行比较。
如果你只是想在插入时确保密钥不在 HashMap
中,你可以使用 putIfAbsent(K key, V value)
方法:
Student s = students.putIfAbsent(sNo, new Student(sNo, name));
如果该条目已经存在,则由该方法返回,否则该方法将该条目插入映射中并且 returns null
:
if (s != null) {
System.out.println("Student "+s.getSno()+" already exists");
}