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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jingzhouheima 中级黑马   /  2013-7-26 12:59  /  1869 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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

评分

参与人数 1技术分 +1 收起 理由
万琪 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
万琪 + 1 很给力!

查看全部评分

回复 使用道具 举报
好吧,这个问题其实挺简单的,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>
复制代码
回复 使用道具 举报
   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);
}
   
   
回复 使用道具 举报
next() 函数把指向当前元素的指针移动到下一个元素的位置,并返回当前元素的值。 如果内部指针已经超过数组的最后一个元素,函数返回 false。
while(it.hasNext())
   {
   sop("key:"+it.next()+" values:"+map.get(it.next()));
  }
而你这段代码,再一次循环中调用了两遍next()相当于你调用了2个元素,你一共就4个元素所以就打印4个值。
回复 使用道具 举报
yinjiek 发表于 2013-7-26 13:47
set 集合中没有键值对怎么可能打印出键值来,你在map集合中天添加的4组元素也放到set集合中来打印in.nex ...

是Map里的一列放入了Set中。。
回复 使用道具 举报
看了下面的你就知道了,上次忘记了不好意思啊
//如何打印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());
                        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马