我有这个Hashmap:
HashMap<String, Student> students = new HashMap<String, Student>();
从用户输入(sNo,name)获取2个String值后,我已经能够将这些值放入hashmap中:
students.put(sNo, new Student(sNo, name));
我的问题是,每次运行此过程时,我都希望能够检查Hashmap键以确保输入的sNo与先前使用的sNo不同。
我尝试了if(sNo == students.keySet())
,但这不起作用。
答案 0 :(得分:2)
如果让我们说5(sNo)与对象(keySet())相同,你所做的就是比较。你总是会失败这种情况。你正在寻找的是查询keySet,如果它包含你的sNo值。
if (students.keySet().has(sNo))
Map以这种方式为此提供了一个快捷方式:
if (students.containsKey(sNo))
另外,作为一个旁注,在Java中,我们写这个:
Map<Integer, Student> students = new HashMap<>();
上面的代码告诉我们,students变量是一个以Integer为键,Student为值的Map。实际的地图实现是未知的,你不应该真的关心它。然后创建一个HashMap,它是Map接口的实际实现,并使用所谓的菱形运算符&lt;&gt;你告诉编译器,键和值与变量声明中的键和值是通用的。
答案 1 :(得分:1)
您必须使用循环来与您当前在hashmap中的所有键进行比较,一次一个。这样你就可以将sNo与key1进行比较,然后将sNo与key2进行比较,等等。你现在正在尝试的方式,
(sNo == students.keySet())
尝试将一个键与一整套键进行比较,这对计算机没有意义。比较&#34;事物&#34;,两者&#34;事物&#34;需要是相同的类型,在这种情况下键入&#34; String&#34;。循环的语法是
for(String s: students.keySet()){
//body
}
这个for循环意味着&#34;对于密钥集中的每个字符串...(正文:将sNo与s进行比较)&#34;然后在体内进行比较。
重要!:您不应该将字符串与&#34; ==&#34;进行比较,您应该将它们与.equals()进行比较。例如,不要做
if(sNo == s)
而是
if(sNo.equals(s))
如果您想知道我在哪里获得了s,请查看for循环内部。对于键集中的每个String,它将分配给s变量。现在您已经有了for循环,请在键集中的每个字符串与当前键sNo之间进行比较。
答案 2 :(得分:0)
如果您只想确保插入时HashMap
中的密钥不存在,则可以使用putIfAbsent(K key, V value)
方法:
Student s = students.putIfAbsent(sNo, new Student(sNo, name));
如果条目已经存在,则由方法返回,否则方法会在地图中插入条目并返回null
:
if (s != null) {
System.out.println("Student "+s.getSno()+" already exists");
}