-1

我一直在编写一个简单的 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 个值。为什么会这样?

4

3 回答 3

0

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());
}
于 2018-05-17T04:46:51.637 回答
0

我建议您使用 Map.Entry 接口来迭代 Map。

    HashMap<String, Integer> hm2 = 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);


    for(Map.Entry<String, Integer> e: hm2.entrySet()) {
        System.out.println("Key: " + e.getKey() + " Values:" + e.getValue());
    }
于 2018-05-17T08:49:21.670 回答
0

这是因为每当您执行此操作itr.next()时,迭代器都会向前移动一步并返回值。因此,当您itr.next()在一次迭代中调用两次时,您只会得到 3 个值,而当您只调用一次时,您会得到所有六个值。因此,如果您使用所有六个值,则应使用hm2.get(key).

于 2018-05-17T04:44:32.213 回答