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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© up.yfei 中级黑马   /  2013-5-9 19:08  /  1594 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 up.yfei 于 2013-5-9 19:56 编辑

先看下代码:
  1. import java.util.*;
  2. /*
  3. 每一个学生都有对应的归属地。
  4. 学生Student,地址String。
  5. 学生属性:姓名,年龄。
  6. 注意:姓名和年龄相同视为同一个学生。
  7. 保证学生的唯一性。

  8. 1,描述学生。
  9. 2,定义Map容器,将学生作为键,地址作为值,存入。
  10. 3,获取Map集合中的元素。
  11. */
  12. class Student implements Comparable<Student>
  13. {
  14.         private String name;
  15.         private int age;
  16.         Student(String name,int age)
  17.         {
  18.                 this.name=name;
  19.                 this.age=age;
  20.         }
  21.         public boolean equals(Object obj)
  22.         {
  23.                 if(!(obj instanceof Student))
  24.                         throw new ClassCastException("类型不匹配");

  25.                 Student s = (Student)obj;

  26.                 return this.name.equals(s.name) && this.age==s.age;
  27.         }
  28.         public int hashCode()
  29.         {
  30.                 return name.hashCode()+age*21;
  31.         }
  32.         public int compareTo(Student s)
  33.         {
  34.                 int num = new Integer(this.age).compareTo(new Integer(s.age));

  35.                 if(num == 0)
  36.                         return this.name.compareTo(s.name);
  37.                 return num;
  38.         }

  39.         public String getName()
  40.         {
  41.                 return name;
  42.         }
  43.         public int getAge()
  44.         {
  45.                 return age;
  46.         }
  47. }

  48. class MapTest
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                 HashMap<Student,String> hm = new HashMap<Student,String>();
  53.                 hm.put(new Student("张三",21),"北京");
  54.                 hm.put(new Student("李四",22),"上海");
  55.                 hm.put(new Student("王五",23),"河南");
  56.                 hm.put(new Student("赵六",24),"天津");

  57.                 Set<Map.Entry<Student,String>> sme = hm.entrySet();

  58.                 Iterator<Map.Entry<Student,String>> it = sme.iterator();

  59.                 while(it.hasNext())
  60.                 {
  61.                         Student key = it.next().getKey();
  62.                         String value = it.next().getValue();

  63.                         System.out.println("姓名:"+key.getName()+"\t年龄:"+key.getAge()+"\t\t地址:"+value);
  64.                 }
  65.         }
  66. }
复制代码
就是说,我现在的代码,运行出来有问题
结果是:



这是为什么?

如果把while循环里的
Student key = it.next().getKey();
String value = it.next().getValue();

这两个代码改成

Map.Entry<Student,String> me = it.next();
Student key = me.getKey();
String value = me.getValue();
就没问题了,这是为什么?这两种有什么不同么?

感谢各位,谢谢

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 张洪慊 于 2013-5-9 19:32 编辑


  1.                 while(it.hasNext())
  2.                 {
  3.                         Student key = it.next().getKey();//这个位置遍历出第一个集合中第一个关系(key-value),由于HashMap存入和取出顺序不一定一致,
  4.                                                                            //依照你的运行结果取出的是赵六

  5.                           String value = it.next().getValue();//但这里it.next()注意,这里又调用一次next(),指针后移,取出的是第二个关系的Value->北京
  6.                         /*
  7.                           修正:
  8.                              Map.Entry<Student,String> me=it.next();
  9.                             Student key=me.getKey();
  10.                             String value=me.getValue();
  11.                          */
  12.                         System.out.println("姓名:"+key.getName()+"\t年龄:"+key.getAge()+"\t\t地址:"+value);
  13.                 }
  14.         
复制代码
回复 使用道具 举报
逸盏清茶 来自手机 中级黑马 2013-5-9 19:34:39
藤椅
本帖最后由 逸盏清茶 于 2013-5-9 19:37 编辑

当然不同了,第一种写法中两行代码中都调用了it.next();第一行中得到的是前一对元素的key;第二行中得到的是后一对元素的value.也就是得到的结果会是前一元素的key和后一个元素的value.

手机打的累啊。。。
回复 使用道具 举报
张洪慊 发表于 2013-5-9 19:30

哦~明白了,犯了个低级错误,谢谢了
回复 使用道具 举报
逸盏清茶 发表于 2013-5-9 19:34
当然不同了,第一种写法中两行代码中都调用了it.next();第一行中得到的是前一对元素的key;第二行中得到的 ...

嗯,我知道什么情况了,感谢ing....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马