java - [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 个值。为什么会这样?
解决方案
您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());
}
推荐阅读
- javascript - 在 iframe 中设置交叉原点变量
- java - TabLayout 中 Fragment 的 onStop 以保存一些内容
- python - 创建平滑的跳跃动画
- laravel - 通过 mailgun 发送电子邮件时,此路由不支持 GET 方法
- javascript - 如何使网站按价格从大到小排序
- python - ImportError:无法从“预处理”导入名称“inception_preprocessing”
- pagination - 对集合使用分页时出现 Jekyll 布局错误 (jekyll-paginate-v2)
- json - 尝试通过 Compass 将 JSON 文件导入 MongoDB 时出现错误
- django - 为什么变量不能与 Django 信号中的“实例”一起使用?
- nginx - nginx 总是在域后添加斜杠