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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘茂林 于 2013-5-16 00:04 编辑

汗 实在找不出来了 都看了半个小时了。。本来想靠自己搞定的。。


  1. /**
  2. * Map 应用: 需求 每一个学生都有对应的归属地。 学生Student,地址String 学生属性: 姓名, 年龄 注意:姓名和年龄相同的视为同一个学生。
  3. * 保证学生的唯一性。
  4. *
  5. * 1, 描述学生的唯一性。
  6. *
  7. * 2,定义map容器,将学生作为键,地址作为值,存入。
  8. *
  9. * 3,获取map集合中的元素
  10. *
  11. */
  12. import java.util.*;

  13. class Student implements Comparable<Student>
  14. {
  15.     private String name;
  16.     private int age;

  17.     Student(String name, int age)
  18.     {
  19.         this.name = name;
  20.         this.age = age;
  21.     }

  22.     public int compareTo(Student s)// 比较的
  23.     {
  24.         int num = new Integer(this.age).compareTo(new Integer(s.age));
  25.         if (num == 0)
  26.         {
  27.             return this.name.compareTo(s.name);
  28.         }
  29.         return num;
  30.     }

  31.     public int hashCode()// 需要复写哈希码
  32.     {
  33.         return name.hashCode()+age*34;
  34.     }

  35.     public boolean equals(Object obj)// 判断相等 复写 equals方法
  36.     {
  37.         if (!(obj instanceof Student))
  38.         {
  39.             throw new ClassCastException("类型不匹配");
  40.         }
  41.         Student s = (Student) obj;

  42.         return this.name.equals(s.name) && this.age == s.age;
  43.     }

  44.     public String getName()
  45.     {
  46.         return name;
  47.     }

  48.     public int getAge()
  49.     {
  50.         return age;
  51.     }

  52.     public String toStrint()
  53.     {
  54.         return name + ":" + age;
  55.     }

  56. }

  57. public class MapTest
  58. {
  59.     public static void main(String[] args)
  60.     {
  61.         /*Student st1 = new Student("liu01", 23);
  62.         Student st2 = new Student("liu02", 24);
  63.         Student st3 = new Student("liu03", 22);
  64.         Student st4 = new Student("liu04", 21);
  65.          */
  66.         HashMap<Student, String> hm = new HashMap<Student, String>();
  67.         hm.put(new Student("liu01", 22), "beijing");
  68.         hm.put(new Student("liu03", 23), "shanghai");
  69.         hm.put(new Student("liu04", 24), "wuhan");
  70.         hm.put(new Student("liu02", 22), "nanjing");

  71.         // 第一种取出方式 keySet
  72.         Set<Student> keySet = hm.keySet();// 尖括号 泛型

  73.         Iterator<Student> it = keySet.iterator();// 这里也用到泛型

  74.         while (it.hasNext())
  75.         {
  76.             Student stu = it.next();
  77.             String add = hm.get(stu);

  78.             System.out.println(stu + "...." + add);

  79.         }
  80.     }

  81. }
复制代码
打印的时候打印的不是 Student的 姓名和年龄  打印的是hashCode 还是 地址?

3 个回复

倒序浏览
一眼看出 63行 toStrint() 写错了 应该是toString()
回复 使用道具 举报
你的toString方法写错了 toString方法是Object类中的方法 如果没有覆盖成功则打印出来的是Student@哈希值。
有两种方法可以打印出Student的姓名和年龄。
方法1:复写toString()方法。
方法2: 在打印的时候直接调用学生类的getName()和getAge()方法。
代码示例:


  1. /**
  2. * Map 应用: 需求 每一个学生都有对应的归属地。 学生Student,地址String 学生属性: 姓名, 年龄 注意:姓名和年龄相同的视为同一个学生。
  3. * 保证学生的唯一性。
  4. *
  5. * 1, 描述学生的唯一性。
  6. *
  7. * 2,定义map容器,将学生作为键,地址作为值,存入。
  8. *
  9. * 3,获取map集合中的元素
  10. *
  11. */
  12. import java.util.*;

  13. class Student implements Comparable<Student>
  14. {
  15.     private String name;
  16.     private int age;

  17.     Student(String name, int age)
  18.     {
  19.         this.name = name;
  20.         this.age = age;
  21.     }

  22.     public int compareTo(Student s)// 比较的
  23.     {
  24.         int num = new Integer(this.age).compareTo(new Integer(s.age));
  25.         if (num == 0)
  26.         {
  27.             return this.name.compareTo(s.name);
  28.         }
  29.         return num;
  30.     }

  31.     public int hashCode()// 需要复写哈希码
  32.     {
  33.         return name.hashCode()+age*34;
  34.     }

  35.     public boolean equals(Object obj)// 判断相等 复写 equals方法
  36.     {
  37.         if (!(obj instanceof Student))
  38.         {
  39.             throw new ClassCastException("类型不匹配");
  40.         }
  41.         Student s = (Student) obj;

  42.         return this.name.equals(s.name) && this.age == s.age;
  43.     }

  44.     public String getName()
  45.     {
  46.         return name;
  47.     }

  48.     public int getAge()
  49.     {
  50.         return age;
  51.     }

  52.     public String toStrint()  //  第一种方法: 把toStrint改成 toString
  53.     {
  54.         return name + ":" + age;
  55.     }

  56. }

  57. public class MapTest
  58. {
  59.     public static void main(String[] args)
  60.     {
  61.         /*Student st1 = new Student("liu01", 23);
  62.         Student st2 = new Student("liu02", 24);
  63.         Student st3 = new Student("liu03", 22);
  64.         Student st4 = new Student("liu04", 21);
  65.          */
  66.         HashMap<Student, String> hm = new HashMap<Student, String>();
  67.         hm.put(new Student("liu01", 22), "beijing");
  68.         hm.put(new Student("liu03", 23), "shanghai");
  69.         hm.put(new Student("liu04", 24), "wuhan");
  70.         hm.put(new Student("liu02", 22), "nanjing");

  71.         // 第一种取出方式 keySet
  72.         Set<Student> keySet = hm.keySet();// 尖括号 泛型

  73.         Iterator<Student> it = keySet.iterator();// 这里也用到泛型

  74.         while (it.hasNext())
  75.         {
  76.             Student stu = it.next();
  77.             String add = hm.get(stu);

  78.             System.out.println(stu + "...." + add);//第二种方法:改成System.out.println(stu.getName()+":"stu.getAge());

  79.         }
  80.     }

  81. }
复制代码
回复 使用道具 举报
本帖最后由 刘茂林 于 2013-5-16 00:05 编辑
刘学明    发表于 2013-5-16 00:01
你的toString方法写错了 toString方法是Object类中的方法 如果没有覆盖成功则打印出来的是Student@哈希值。 ...

真失败啊。。犯了个这种错误。。。多谢了。。

没想到还有第二种方法。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马