黑马程序员技术交流社区
标题:
TreeSet问题??
[打印本页]
作者:
王宝龙
时间:
2012-9-25 20:19
标题:
TreeSet问题??
本帖最后由 王宝龙 于 2012-9-25 20:46 编辑
首先定义了一个Person类,然后定义Student类并继承Person类 。定义了Person对象和Student对象存入TreeSet中
Person类中有自己的compareTo方法 Student中也有自己的compareTo方法
存入不同的类对象之间不用排序吗?如果排序是怎么排的?
import java.util.*;
class TreeSetDemo8
{
public static void main(String[] arge)
{
TreeSet ts = new TreeSet();
ts.add(new Person("Perlisi00",24));
ts.add(new Person("Perlisi02",23));
ts.add(new Student("Stulisi07",43));
ts.add(new Student("Stulisi08",40));
ts.add(new Person("Perlisi03",21));
Iterator it = ts.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
sop(p.getName()+"^^^^^^^^"+p.getAge());
}
Person p1 = new Person("zhangsan",18);
sop(p1.toString());
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Person implements Comparable//定义一个Person类
{
private String name;
private int age;
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Object obj)//按年龄排序
{
if(!(obj instanceof Person))
throw new RuntimeException("不是人对象");
Person p = (Person)obj;
if(this.age>p.age)
return 1;
if(this.age==p.age)
{
return this.name.compareTo(p.name);
}
return -1;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class Student extends Person
{
public Student(String name,int age)
{
super(name,age);
}
public int compareTo(Object obj)//按姓名排序
{
if(!(obj instanceof Person))
throw new RuntimeException("不是人对象");
Person p = (Person)obj;
int num = this.getName().compareTo(p.getName());
if(num==0)
{
return this.getAge()-p.getAge();
}
return num;
}
public String getName()
{
return super.getName();
}
public int getAge()
{
return super.getAge();
}
}
复制代码
作者:
尤圣回
时间:
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