黑马程序员技术交流社区

标题: map 的迭代问题 求解 [打印本页]

作者: 宗士为    时间: 2012-5-10 11:13
标题: map 的迭代问题 求解
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

作者: 周素强    时间: 2012-5-10 11:41
本帖最后由 周素强 于 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));
   }
}

作者: 李啸    时间: 2012-5-10 11:44
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循环做
}

作者: 小小企鹅    时间: 2012-5-10 12:28
本帖最后由 小小企鹅 于 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在第二次执行后没有元素可以迭代;
    }
}
}
作者: 徐然    时间: 2012-5-10 13:02
本帖最后由 徐然 于 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() ,那取的不就是第二个了吗
}

作者: 黄坚声    时间: 2012-5-10 13:07
//最常规的一种遍历方法,最常规就是最常用的,虽然不复杂,但很重要,这是我们最熟悉的,就不多说了!!
    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());
        }
    }
这个方法是我从张孝祥视频学到的。
作者: 黄坚声    时间: 2012-5-10 13:10
 //利用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
因为当你循环时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));   
}
}

作者: 蒋映辉    时间: 2012-5-10 13:59
iter.hasNext();语句就已经把指针后移了   这个跟read()差不多   
感觉JAVA里的读取好像都是这样的




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