黑马程序员技术交流社区

标题: TreeSet问题?? [打印本页]

作者: 王宝龙    时间: 2012-9-25 20:19
标题: TreeSet问题??
本帖最后由 王宝龙 于 2012-9-25 20:46 编辑

首先定义了一个Person类,然后定义Student类并继承Person类 。定义了Person对象和Student对象存入TreeSet中
Person类中有自己的compareTo方法 Student中也有自己的compareTo方法
存入不同的类对象之间不用排序吗?如果排序是怎么排的?
  1. import java.util.*;

  2. class TreeSetDemo8
  3. {
  4.         public static void main(String[] arge)
  5.         {
  6.                 TreeSet ts = new TreeSet();
  7.                
  8.                 ts.add(new Person("Perlisi00",24));
  9.                
  10.                 ts.add(new Person("Perlisi02",23));
  11.                 ts.add(new Student("Stulisi07",43));
  12.                 ts.add(new Student("Stulisi08",40));
  13.                 ts.add(new Person("Perlisi03",21));
  14.                 Iterator it = ts.iterator();
  15.                 while(it.hasNext())
  16.                 {
  17.                         Person p = (Person)it.next();
  18.                         sop(p.getName()+"^^^^^^^^"+p.getAge());
  19.                 }
  20.                 Person p1 = new Person("zhangsan",18);
  21.                 sop(p1.toString());
  22.         }
  23.         public static void sop(Object obj)
  24.         {
  25.                 System.out.println(obj);
  26.         }
  27. }
  28. class Person implements Comparable//定义一个Person类
  29. {
  30.         private String name;
  31.         private int age;
  32.         public Person(String name,int age)
  33.         {
  34.                 this.name=name;
  35.                 this.age=age;
  36.         }
  37.         public int compareTo(Object obj)//按年龄排序
  38.         {
  39.                 if(!(obj instanceof Person))
  40.                         throw new RuntimeException("不是人对象");
  41.                         
  42.                 Person p = (Person)obj;
  43.                
  44.                
  45.                 if(this.age>p.age)
  46.                         return 1;
  47.                 if(this.age==p.age)
  48.                 {
  49.                         return this.name.compareTo(p.name);
  50.                 }
  51.                 return -1;
  52.         }
  53.         public String getName()
  54.         {
  55.                 return name;
  56.         }
  57.         public int getAge()
  58.         {
  59.                 return age;
  60.         }
  61. }
  62. class Student extends Person
  63. {
  64.         public Student(String name,int age)
  65.         {
  66.                 super(name,age);
  67.         }
  68.         public int compareTo(Object obj)//按姓名排序
  69.         {
  70.                 if(!(obj instanceof Person))
  71.                         throw new RuntimeException("不是人对象");
  72.                         
  73.                 Person p = (Person)obj;
  74.                
  75.                 int num = this.getName().compareTo(p.getName());
  76.                 if(num==0)
  77.                 {
  78.                         return this.getAge()-p.getAge();
  79.                 }
  80.                 return num;
  81.         }
  82.         public String getName()
  83.         {
  84.                 return super.getName();
  85.         }
  86.         public int getAge()
  87.         {
  88.                 return super.getAge();
  89.         }
  90.         
  91.         
  92. }
复制代码

作者: 尤圣回    时间: 2012-9-25 20:22
Student的compareTo是父类继承下来的所以他和父类是同一个compareTo
作者: 罗磊    时间: 2012-9-25 20:31
首先定义了一个Person类,然后定义Student类并继承Person类 。定义了Person对象和Student对象存入TreeSet中
Person类中有自己的compareTo方法 Student中也有自己的compareTo方法
存入不同的类对象之间不用排序吗?如果排序是怎么排的?//可以自己定义一个比较器!让对象按你想的方式排序!
作者: 明光照    时间: 2012-9-25 20:31
看来看去。我发现那个compareTo跟本就没有执行啊。
作者: 李建强    时间: 2012-9-25 20:34
1、哪个compareTo的问题,需要看当前是添加哪一个对象,
调用的是这个对象的compareTo()。具体实现看它的compareTo()。
2、可以自己定义比较器,
class Comp implements Comparator<Person>
{
public int compare(Person p1,Person p2)
{
  return p1.getName().compareTo(p2.getName());
}
}
这个比较器可以比较Person类的子类。

作者: 杨卫腾    时间: 2012-9-25 20:36
首先定义了一个Person类,然后定义Student类并继承Person类 。
定义了Person对象和Student对象存入TreeSet中

Person类中有自己的compareTo方法 Student中也有自己的compareTo方法
  存入不同的类对象之间不用排序吗?
  只有相同的对象之间才能排序的,这是因为你的Person类 和 Student类 中都有自己的
  比较方法,Person类中覆盖的CompareTo() 方法使用的是年龄排序的, 而 Student类
  中覆盖的CompareTo() 方法是按照姓名排序的。 试问不同类之间 是用年龄排序呀还是
  用姓名排序呀。
  
  要是你执意要不同类之间进行排序的话,那你就传进去一个比较器,实现Comparator接口
  使用同统一的规则排序。比如年龄
                 TreeSet<Person> ts = new TreeSet<Person>(new Comparator<Person>(){
                                        public int compare(Person p1, Person p2){
                                                int temp = p1.getAge() - p2.getAge();
                                                return temp==0? p1.getName().compareTo(p2.getName()): temp;
                                        }       
                                });

如果排序是怎么排的?

不同类之间是不排序的,因为没有办法(各自的比较方式不同)排序,同类之间才能进行排序的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2