如何访问Hashmap的键并将它们与预定值进行比较?

时间:2015-05-23 01:40:22

标签: java hashmap unique

我有这个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()),但这不起作用。

3 个答案:

答案 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");
}