如何访问 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");
}