首页 > 解决方案 > [hashmap][iterator] 给出一半值

问题描述

我一直在编写一个简单的 HashMap 迭代程序并遇到以下问题:

HashMap<String, Integer> hm1 = new HashMap<String, Integer>();
hm2.put("One", 1);
hm2.put("Two", 2);
hm2.put("Three", 3);
hm2.put("Four", 4);
hm2.put("Five", 5);
hm2.put("Six", 6);


Set<String> keySet = hm2.keySet();
Iterator<String> itr = keySet.iterator();

while(itr.hasNext())
{
    String key = itr.next();
    System.out.println("Key: " + key + "Values:" + hm2.get(itr.next()));
}

问题 -hm2.get(itr.next())在输出中只给出 3 个值,而如果我使用 hm2.get(key) 那么它会列出所有 6 个值。为什么会这样?

标签: javahashmapiterator

解决方案


next()在循环内两次推进迭代器(通过调用),因此“跳过”了一半的值。next()每次检查时您应该只调用一次hasNext()。在这种情况下,只需重用您的局部key变量:

Set<String> keySet = hm2.keySet();
Iterator<String> itr = keySet.iterator();
while(itr.hasNext())
{
    String key = itr.next();
    System.out.println("Key: " + key + "Values:" + hm2.get(key));
}

请注意,顺便说一句,您可以只遍历entrySet(),而不是遍历keySet(),然后获取每个键的值:

Set<Map.Entry<String, Integer>> entrySet = hm2.entrySet();
Iterator<Map.Entry<String, Integer>> itr = entrySet.iterator();
while(itr.hasNext())
{
    Map.Entry<String, Integer> entry = itr.next();
    System.out.println("Key: " + entry.getKey() + "Values:" + entry.getValue());
}

或者,更优雅的是,使用增强的 for 循环:

for (Map.Entry<String, Integer> entry : hm2.entrySet()) 
{
    System.out.println("Key: " + entry.getKey() + "Values:" + entry.getValue());
}

推荐阅读