黑马程序员技术交流社区

标题: 关于调用Map中的keySet方法的时候,迭代器的小疑问 [打印本页]

作者: 白_蓝(八公)    时间: 2013-7-12 16:31
标题: 关于调用Map中的keySet方法的时候,迭代器的小疑问
本帖最后由 白_蓝(八公) 于 2013-7-12 17:38 编辑

                Set<Integer> keyset =al.keySet();  //al为Map集合

                Iterator<Integer> it = keyset.iterator();
                while(it1.hasNext())  //毕老师的“常规写法”
                {
                        int i = it.next();
                        System.out.println("key:"+i+"-------"+"value"+hsm.get(i));
                }
                for(Integer i : hsm.keySet())
                {
                        System.out.println(i+"----"+hsm.get(i));
                }

而在while循环中 ,我觉得it.next()是指向了key ,也就是集合中的键,刚开始我是直接这么写--System.out.println("key:"+it.next()+"-------"+"value"+hsm.get(it.next()));

不过提示报错  所以上网找了下资料  都有正确的写法  不过就是没有解释  所以想请教下是怎么回事~~~~

而在高级for循环中,个人理解是Integer i  实现了        int i = it.next();这一步,所以直行通过了!如果没理解错的话,最后还是回归到上述的那个问题,求解答


作者: 草貌路飞    时间: 2013-7-12 17:03
因为System.out.println("key:"+it.next()+"-------"+"value"+hsm.get(it.next()));中执行了再次next();一般情况下每次循环中只会出现一次next,否则集合中的元素个数为奇数时,第二个next就找不到元素了,就会出错
作者: 白_蓝(八公)    时间: 2013-7-12 17:24
草貌路飞 发表于 2013-7-12 17:03
因为System.out.println("key:"+it.next()+"-------"+"value"+hsm.get(it.next()));中执行了再次next();一 ...

你的意思是每次循环都只能执行一次next()咯?

而且我想起没执行一次next()角标都会自动后移一次,也就是说如果一个循环中出现了两次next()的话,其实对应的键已经不是我们需要的那个键了
作者: 薛淑凯    时间: 2013-7-12 17:24
楼上正解,调用一次next指针就向后移动一位,当剩下最后一个元素的时候hasnext返回还是true,你只能next一次,再next就出错了。而且你这样取出来的键和值没有了对应关系,刚好错开了,毕老师的视频有讲到。还有一点,你从al取的键集合,为什么拿着这个键去对另一个集合使用get呢
作者: 白_蓝(八公)    时间: 2013-7-12 17:35
薛淑凯 发表于 2013-7-12 17:24
楼上正解,调用一次next指针就向后移动一位,当剩下最后一个元素的时候hasnext返回还是true,你只能next一 ...

哦哦!hsm是MAP的一个对象  调用了get方法取里面的value   我没有标注出来!!

谢谢你哈~刚才一个朋友的回答让我回忆起来了~只是昨天做练习的时候纠结了下!~就愣住了·




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2