A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宗士为 中级黑马   /  2012-5-10 11:13  /  2243 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class MapDemo {
public static void main(String[] args) {
  demo2();
}
private static void demo2() {
  Map<String, Integer> map = new HashMap<String, Integer>();
  map.put("张三", 85);
  map.put("李四", 88);
  map.put("王五", 80);
  map.put("赵六", 80);
Set<String> set = map.keySet();
    for(Iterator<String> iter = set.iterator(); iter.hasNext();)
           System.out.println(iter.next() + map.get(iter.next()));   
}
为什么结果不是以下
赵六 : 80
张三 : 85
李四 : 88
王五 : 80
而只打印两个
赵六85
李四80

8 个回复

倒序浏览
本帖最后由 周素强 于 2012-5-10 12:04 编辑

我看你的意思是想用高级For,所以我给你改了一下看一下吧:
import java.util.*;
public class MapDemo
{
        public static void main(String[] args)
        {
        demo2();
        }
        private static void demo2()
        {
          Map<String, Integer> map = new HashMap<String, Integer>();
          map.put("张三", 85);
          map.put("李四", 88);
          map.put("王五", 80);
          map.put("赵六", 80);
          Set<String> set = map.keySet();
          //Iterator<String> iter = set.iterator();
          for(String s : set)
                System.out.println(s + map.get(s));   
        }
}

用迭代器帮你改一下,有个地方你写错了,看代码吧:
private static void demo2()
{
   Map<String, Integer> map = new HashMap<String, Integer>();
   map.put("张三", 85);
   map.put("李四", 88);
   map.put("王五", 80);
   map.put("赵六", 89);
   Set<String> set = map.keySet();
   Iterator<String> iter = set.iterator();
   while(iter.hasNext())
   {
    String s = iter.next();
    //System.out.println(iter.next() + map.get(iter.next())); //这里你调用了两次iter.next()
   System.out.println(s + map.get(s));
   }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
public class MapDemo {
public static void main(String[] args) {
   demo2();
}
private static void demo2() {
   Map<String, Integer> map = new HashMap<String, Integer>();
   map.put("张三", 85);
   map.put("李四", 88);
   map.put("王五", 80);
   map.put("赵六", 80);
Set<String> set = map.keySet();
     for(Iterator<String> iter = set.iterator(); iter.hasNext();)
           System.out.println(iter.next()+ map.get(iter.next()));   //你的iter.next()执行的时候就已经跳到下一个对象中去了所以要用foreach循环做
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 小小企鹅 于 2012-10-27 22:37 编辑

import java.util.*;
public class MapDemo {
public static void main(String[] args) {
  demo2();
}
private static void demo2() {
  Map<String, Integer> map = new HashMap<String, Integer>();
  map.put("张三", 85);
  map.put("李四", 88);
  map.put("王五", 80);
  map.put("赵六", 80);
Set<String> set = map.keySet();
    for(Iterator<String> iter = set.iterator(); iter.hasNext();){
            String str = iter.next();
            System.out.println(str + map.get(str));
       //System.out.println(iter.next() + map.get(iter.next()));   
       //每个for循环iter.next()执行了2次,for在第二次执行后没有元素可以迭代;
    }
}
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 徐然 于 2012-5-10 13:09 编辑

public class MapDemo {
public static void main(String[] args) {
  demo2();
}
private static void demo2() {
  Map<String, Integer> map = new HashMap<String, Integer>();
  map.put("张三", 85);
  map.put("李四", 88);
  map.put("王五", 80);
  map.put("赵六", 80);
Set<String> set = map.keySet();
    for(Iterator<String> iter = set.iterator(); iter.hasNext();)
           System.out.println(iter.next() + map.get(iter.next()));   //for循环条件里已经在迭代了,这里再next() ,那取的不就是第二个了吗
}
回复 使用道具 举报
//最常规的一种遍历方法,最常规就是最常用的,虽然不复杂,但很重要,这是我们最熟悉的,就不多说了!!
    public static void work(Map<String, Student> map) {
        Collection<Student> c = map.values();
        Iterator it = c.iterator();
        for (; it.hasNext();) {
            System.out.println(it.next());
        }
    }
这个方法是我从张孝祥视频学到的。
回复 使用道具 举报
 //利用keyset进行遍历,它的优点在于可以根据你所想要的key值得到你想要的 values,更具灵活性!!
    public static void workByKeySet(Map<String, Student> map) {
        Set<String> key = map.keySet();
        for (Iterator it = key.iterator(); it.hasNext();) {
            String s = (String) it.next();
            System.out.println(map.get(s));
        }
    }
  //比较复杂的一种遍历在这里,呵呵~~他很暴力哦,它的灵活性太强了,想得到什么就能得到什么~~
    public static void workByEntry(Map<String, Student> map) {
        Set<Map.Entry<String, Student>> set = map.entrySet();
        for (Iterator<Map.Entry<String, Student>> it = set.iterator(); it.hasNext();) {
            Map.Entry<String, Student> entry = (Map.Entry<String, Student>) it.next();
            System.out.println(entry.getKey() + "--->" + entry.getValue());
        }
    }
}

这两个方法是我从毕向东视频学的。
回复 使用道具 举报
魏征 中级黑马 2012-5-10 13:53:47
8#
因为当你循环时System.out.println(iter.next() + map.get(iter.next()));   iter.next()是集合中下一个值,所以你打印出来是第一个的键,第二个的值,应当创建对象去接受就iter.next()不会出现这个情况了, 下面的是我改完的代码,运行试试
public class MapDemo {
public static void main(String[] args) {
  demo2();
}
private static void demo2() {
  Map<String, Integer> map = new HashMap<String, Integer>();
  map.put("张三", 85);
  map.put("李四", 88);
  map.put("王五", 80);
  map.put("赵六", 80);
Set<String> set = map.keySet();
    for(Iterator<String> iter = set.iterator(); iter.hasNext();)
{
           String str=iter.next();//创建泛型的类型对象接受iter.next();
           System.out.println(str+ map.get(str));   
}
}
回复 使用道具 举报
iter.hasNext();语句就已经把指针后移了   这个跟read()差不多   
感觉JAVA里的读取好像都是这样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马