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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李红亮 于 2013-12-19 11:21 编辑

程序是这样的:package day16.com;


import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class MapTest2
{
        public static void main(String[] args)
        {
                TreeMap<Student , String> tm = new TreeMap<Student , String>();
                tm.put(new Student("blisi3" , 23) , "nanjing");
                tm.put(new Student("lise1" , 21), "beijing");
                tm.put(new Student("alisi4" ,24), "wuhan");
                tm.put(new Student("lisi" , 21), "tianjin");
                tm.put(new Student("lisi2" , 22), "shanghai");
                Set<Map.Entry<Student , String>> entrySet =
                        tm.entrySet();
                for(Iterator<Map.Entry<Student , String>> it = entrySet.iterator() ; it.hasNext();)
                {
                        Map.Entry<Student, String> me = it.next();
                        Student stu = me.getKey();
                        String addr = me.getValue();
                        System.out.println(stu + "::" + addr);
                }
        }
}

class Student implements Comparable<Student>
{
        private String name;
        private int age;
        Student(String name , int age)
        {
                this.name = name;
                this.age = age;
        }
        
        public int compareTo(Student s)
        {
                int num = new Integer(this.age).compareTo
                (new Integer(s.age));
                if(num == 0)
                        return this.name.compareTo(s.name);
                return num;
        }
        
        public int hashCode()
        {
                return name.hashCode() + age*34;
        }
        
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");
                Student s = (Student)obj;
                return this.name.equals(s.name) && this.age == s.age;
               
        }
        public String getName()
        {
                return name;
        }
        
        public int getAge()
        {
                return age;
        }
}

我运行的结果是:
day16.com.Student@623644c::beijing
day16.com.Student@32b35d::tianjin
day16.com.Student@62364eb::shanghai
day16.com.Student@ad5e51ec::nanjing
day16.com.Student@aba97970::wuhan


我的疑问是:为什么学生对象打印的是Hash值,而不是姓名和年龄?我想要的结果是像毕老师显示那样的:lisi1:21::beijing,
我是按照毕老师里面的程序敲的,各位大神帮忙看看那里出错了.

评分

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

查看全部评分

8 个回复

倒序浏览
for(Iterator<Map.Entry<Student , String>> it = entrySet.iterator() ; it.hasNext();)
                {
                        Map.Entry<Student, String> me = it.next();
                        Student stu = me.getKey();
                        String addr = me.getValue();
                        System.out.println(stu + "::" + addr);
                }
这段代码中取出的key实际上是学生对象,要获取学生的姓名和年龄,需要使用对象的get方法来获取。
System.out.println(stu.getName()+":"+stu.getAge()+"::"+addr);
回复 使用道具 举报
本帖最后由 公子-醉香 于 2013-12-19 11:03 编辑
  1. package day01;

  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Set;
  5. import java.util.TreeMap;
  6. public class TryReturn {
  7.         public static void main(String [] args){
  8.                 TreeMap<Student , String> tm = new TreeMap<Student , String>();
  9.                 tm.put(new Student("lise1" , 21), "beijing");
  10.         tm.put(new Student("lise1" , 21), "beijing");
  11.         tm.put(new Student("alisi4" ,24), "wuhan");
  12.         tm.put(new Student("lisi" , 21), "tianjin");
  13.         tm.put(new Student("lisi2" , 22), "shanghai");
  14.         Set<Map.Entry<Student , String>> entrySet =
  15.                 tm.entrySet();
  16.         for(Iterator<Map.Entry<Student , String>> it = entrySet.iterator() ; it.hasNext();)
  17.         {
  18.                 Map.Entry<Student, String> me = it.next();
  19.                 Student stu = me.getKey();
  20.                 String addr = me.getValue();
  21.                 System.out.println(stu + "::" + addr);
  22.         }
  23.         }
  24.         
  25.         
  26. }

  27. class Student implements Comparable<Student>
  28. {
  29.         private String name;
  30.         private int age;
  31.         Student(String name , int age)
  32.         {
  33.                 this.name = name;
  34.                 this.age = age;
  35.         }
  36.         
  37.         public int compareTo(Student s)
  38.         {
  39.                 int num = new Integer(this.age).compareTo
  40.                 (new Integer(s.age));
  41.                 if(num == 0)
  42.                         return this.name.compareTo(s.name);
  43.                 return num;
  44.         }
  45.         
  46.         public int hashCode()
  47.         {
  48.                 return name.hashCode() + age*34;
  49.         }
  50.         
  51.         public boolean equals(Object obj)
  52.         {
  53.                 if(!(obj instanceof Student))
  54.                         throw new ClassCastException("类型不匹配");
  55.                 Student s = (Student)obj;
  56.                 return this.name.equals(s.name) && this.age == s.age;
  57.                
  58.         }
  59.         public String getName()
  60.         {
  61.                 return name;
  62.         }
  63.         
  64.         public int getAge()
  65.         {
  66.                 return age;
  67.         }

  68.                 @Override
  69.                 public String toString() {
  70.                         return "Student [name=" + name + ", age=" + age + ", hashCode()="
  71.                                         + hashCode() + ", getName()=" + getName() + ", getAge()="
  72.                                         + getAge() + ", getClass()=" + getClass() + ", toString()="
  73.                                         + super.toString() + "]";
  74.                 }
  75.         
  76. }
复制代码

001.PNG (13.9 KB, 下载次数: 40)

001.PNG

评分

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

查看全部评分

回复 使用道具 举报
~IN_HAND~ 发表于 2013-12-19 10:53
for(Iterator it = entrySet.iterator() ; it.hasNext();)
                {
                        Map ...

看毕老师视频,他的没有调用getName()和getAge()方法也把名字和年龄打印出来了。我按照他的敲的,然后我的没显示出来
回复 使用道具 举报
那你就可以按照上面那个哥们的方法,直接复写学生类的toString方法,在toString方法中调用get方法实现打印。
回复 使用道具 举报
你从map中直接用对象取值就是取得地址,一种方法是调用Student中的get方法取值,二是在Student中重写toString()方法,一般第二种方法用的多。
回复 使用道具 举报
~IN_HAND~ 发表于 2013-12-19 11:05
那你就可以按照上面那个哥们的方法,直接复写学生类的toString方法,在toString方法中调用get方法实现打印 ...

还是谢谢你了,按照你的方法也可以,按照上面的也可以,原来是我没有覆盖Object类的toString方法 ,⊙﹏⊙b汗
回复 使用道具 举报
刘松703 发表于 2013-12-19 11:08
你从map中直接用对象取值就是取得地址,一种方法是调用Student中的get方法取值,二是在Student中重写toStri ...

恩,我看毕老师的视频,他用的第二种方法,原来是我忘记重写toString方法了,见笑了(*^__^*)
回复 使用道具 举报

谢了,我发现问题出在那里了,没重写toString()方法,(*^__^*) ,见笑了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马