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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡卿 中级黑马   /  2012-6-18 14:40  /  1659 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡卿 于 2012-6-18 14:49 编辑
  1. import java.util.*;
  2. class Student implements Comparable
  3. {
  4.       private String name;
  5.       private int age;
  6.       private int grade;
  7.           public int compareTo(Object obj)
  8.           {
  9.             Student s = (Student)obj;

  10.                  int num = new Integer(this.grade).compareTo(new Integer(s.grade));

  11.                  return num==0?new Integer(this.age).compareTo(new Integer(s.age)):num;
  12.           }
  13.       public Student(String name,int age,int grade)
  14.       {
  15.         this.name = name;
  16.         this.age = age;
  17.         this.grade = grade;
  18.       }

  19.       public String getName()
  20.           {
  21.         return name;
  22.       }

  23.       public void setName(String name)
  24.           {
  25.          this.name = name;
  26.       }

  27.       public int getAge()
  28.           {
  29.          return age;
  30.       }

  31.       public void setAge(int age)
  32.           {
  33.         this.age = age;
  34.       }

  35.       public int getGrade()
  36.           {
  37.         return grade;
  38.       }
  39.       public void setGrade(int grade)
  40.           {
  41.         this.grade = grade;
  42.       }

  43. }

  44. class MyCompare implements Comparator
  45. {
  46.      public int compare(Object o1,Object o2)
  47.          {
  48.                  Student s1=(Student)o1;
  49.                  Student s2=(Student)o2;
  50.              int num=new Integer(s2.getGrade()).compareTo(new Integer(s1.getGrade()));
  51.                  return num==0?new Integer(s2.getAge()).compareTo(new Integer(s1.getAge())):num;

  52.          }
  53. }
  54. class  Test6
  55. {
  56.         public static void main(String[] args)
  57.         {
  58.                 TreeSet ts= new TreeSet(new MyCompare());
  59.                 ts.add(new Student("张三",20,86));
  60.                 ts.add(new Student("李四",21,86));
  61.                 ts.add(new Student("王五",19,88));
  62.                 ts.add(new Student("周六",18,87));
  63.                 ts.add(new Student("吴七",22,95));
  64.                 //System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
  65.                 Iterator it=ts.iterator();
  66.                 while(it.hasNext())
  67.                 {
  68.                         System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());//这里的方法为什么不能被识别
  69.                 }
  70.         }
  71. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 唐辉辉 于 2012-6-18 14:50 编辑

//System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
因为ts集合里存放的是对象,对象在内存中存放是以哈希值来存放的,在放入ts集合中的也是对象的哈希值。

System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());//这里的方法为什么不能被识别
it.next()需强制转换成Student对象后,才可调用Student类中的成员。
如:
Student stu = (Student)it.next();
System.out.println("姓名"+stu.getName()+"年龄"+stu.getAge()+"分数"+stu.getGrade());
如果不想转换的话,可以定义ts集合和It 时指定其接收的类型。 如下:
TreeSet<Student> ts= new TreeSet<Student> (new MyCompare());
Iterator<Student> it=ts.iterator();
System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
唐辉辉 发表于 2012-6-18 14:45
//System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
因为ts集合里存放的是对象,对象在 ...

谢啦
我自己晕了
回复 使用道具 举报
本帖最后由 黑马—陈磊 于 2012-6-18 14:52 编辑

Iterator it=ts.iterator();
                while(it.hasNext())
                {
                        Student stu=(Student)it.next();  //在循环遍历时还需强转成学生对象                 
                            System.out.println("姓名"+stu.getName()+"年龄"+stu.getAge()+"分数"+stu.getGrade());
                }
回复 使用道具 举报
System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
这可以参考API,其中println方法中最接近的一个就是:public void println(Object x)
此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。
所以你只能得到哈希值。

System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());//这里的方法为什么不能被识别
因为你的Iterator it=ts.iterator();没有使用泛型,此处返回的是object,所以不识别你的方法。
Iterator <Student>it=ts.iterator();
加上类型限定,就可以了~!
回复 使用道具 举报
打印集合需通过遍历来打印哦,
记得无论是Set,List,Map任何一个集合都要通过遍历来打印...
尤其是Map需通过调用EntrySet()方法来调用set集合里的Iterator来遍历....

TreeSet ts= new TreeSet();
Set st = new TreeSet();
无论是ts,还是st,都是一个对象,他里边存的都是对象的引用地址,

写代码时一定要切记,细节,细节决定成败

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马