黑马程序员技术交流社区

标题: 一个关于Map集合的问题。。 [打印本页]

作者: jingzhouheima    时间: 2013-7-26 12:59
标题: 一个关于Map集合的问题。。
本帖最后由 jingzhouheima 于 2013-7-27 20:06 编辑

import java.util.*;

class HashMapDemo
{
public static void main(String[] args)
{
  Map<String,String>  map = new HashMap<String,String>();
  sop("putPre:"+map.put("ha","12"));//最开始覆盖的是NULL
  sop("putLast:"+map.put("ha","5"));//put返回的是被覆盖的那个值。
  map.put("hei","15");
  map.put("hk","14");
  map.put("ll","12");
  //sop(map.get("horizon"));//获取horizon所对应的值
  //Collection<String> coll = map.values();
  //sop("values():"+coll);//打印所有的键Key
  sop(map);//打印的是键值对
  Set<String> keySet = map.keySet();//获取所有的键
  Iterator<String> it = keySet.iterator();
  while(it.hasNext())
  {
   //sop("key:"+it.next());//------------------------------------------------------------------------------------------------------当只打印这句话的时候,会把map中的所有键值对打印出来
   sop("key:"+it.next()+" values:"+map.get(it.next()));//------------------------------------------------------------------而当只打印这句话的时候,就只能打印最后的两个键值对。
  }//------------------------------------------------------------------------------------------------------------------------------------为什么回事这样的情况?????

}
public static void sop(Object obj)
{
  System.out.println(obj);
}
}
问题出现的状况:如图所示:


问题.GIF (5.69 KB, 下载次数: 0)

问题.GIF

作者: 王磊    时间: 2013-7-26 13:37
next()是一个顺延式的方法,也就是说每调用一次,会自动的将迭代器指针的位置顺延到下一位。

sop("key:"+it.next()+" values:"+map.get(it.next())),这条语句你调用了两次it.next(),就相当于取了第一个元素的键,然后又取了一次第二次元素的值。

正确的做法,是定义一个变量,来存放next()方法迭代到的元素,并对这个变量进行操作。

附上修改后的代码,加注释的为修改过的地方
  1. package test;


  2. import java.util.*;

  3. public class test1
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                   Map<String,String>  map = new HashMap<String,String>();
  8.                   sop("putPre:"+map.put("ha","12"));
  9.                   sop("putLast:"+map.put("ha","5"));
  10.                   map.put("hei","15");
  11.                   map.put("hk","14");
  12.                   map.put("ll","12");

  13.                   sop(map);
  14.                   Set<String> keySet = map.keySet();
  15.                   Iterator<String> it = keySet.iterator();
  16.                   
  17.                   String key;//定义变量
  18.                   
  19.                   while(it.hasNext())
  20.                   {
  21.                           key = it.next();//变量指向迭代到的元素的键

  22.                    sop("key:"+key+" values:"+map.get(key));//对变量进行操作
  23.                   }

  24.         }
  25.         public static void sop(Object obj)
  26.         {
  27.           System.out.println(obj);
  28.         }
  29. }
复制代码

作者: xuluheng718    时间: 2013-7-26 13:45
好吧,这个问题其实挺简单的,sop("key:"+it.next()+" values:"+map.get(it.next())); 这句程序中next()就移动了2次,每一次调用next()方法,指针就移动一次,你把这句分两步完成就没问题:

  1. <P> String key = null;//定义个临时变量;
  2.   while(it.hasNext())
  3.   {
  4.    //sop("key:"+it.next());//当只打印这句话的时候,会把map中的所有键值对打印出来
  5.    key = it.next();
  6.    sop("key:"+key+" values:"+map.get(key));//而当只打印这句话的时候,就只能打印最后的两个键值对。
  7.   }</P>
复制代码

作者: yinjiek    时间: 2013-7-26 13:47
   set 集合中没有键值对怎么可能打印出键值来,你在map集合中天添加的4组元素也放到set集合中来打印in.next()获取的是map集合中下一个元素的值,而set获取的是第一个元素的键 结果就是  key1=key2.value了!
Set<String> keySet = map.keySet();//获取所有的键
                   Iterator<String> it = keySet.iterator();
                   while(it.hasNext())
                   {
                    //sop("key:"+it.next());//------------------------------------------------------------------------------------------------------
                    sop("key:"+it.next()+" values:");//------------------------------------------------------------------                   }//               
for(String s:map.values()){
      System.out.println(s);
}
   
   
作者: 陈贺    时间: 2013-7-26 14:48
next() 函数把指向当前元素的指针移动到下一个元素的位置,并返回当前元素的值。 如果内部指针已经超过数组的最后一个元素,函数返回 false。
while(it.hasNext())
   {
   sop("key:"+it.next()+" values:"+map.get(it.next()));
  }
而你这段代码,再一次循环中调用了两遍next()相当于你调用了2个元素,你一共就4个元素所以就打印4个值。

作者: jingzhouheima    时间: 2013-7-27 19:53
yinjiek 发表于 2013-7-26 13:47
set 集合中没有键值对怎么可能打印出键值来,你在map集合中天添加的4组元素也放到set集合中来打印in.nex ...

是Map里的一列放入了Set中。。
作者: yinjiek    时间: 2013-7-27 23:04
看了下面的你就知道了,上次忘记了不好意思啊
//如何打印HashMap中的键值;通过Map.Entry类添加到set集合
                HashMap<String, Integer> map=new HashMap<String, Integer>();
                map.put("a", 1);
                map.put("b", 2);
                map.put("c", 3);
                Set<Map.Entry<String, Integer>> Entryset=map.entrySet();//Map.Entry类通过set集合可以进行迭代;
                        for(Map.Entry<String, Integer> entry:Entryset){
                                System.out.println(entry.getKey()+":"+entry.getValue());
                        }





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