黑马程序员技术交流社区
标题:
TreeSet问题
[打印本页]
作者:
hmwudizl91zl
时间:
2013-10-6 11:34
标题:
TreeSet问题
本帖最后由 hmwudizl91zl 于 2013-10-6 17:36 编辑
TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
作者:
The_Wizard
时间:
2013-10-6 12:37
这个考虑的情况有好几种:
1,子类没有 compareTo方法,这时同时放入了父类和子类的实例对象使用的都是父类的compareTo方法。
2,如果子类也有 compareTo方法,在添加子类对象时会调用子类的 compareTo方法。这时得看子类的 compareTo方法怎么实现了。因为TreeSet对象调用 add(子类) 时,会调用子类的 compareTo方法,该方法的参数传递是Object对象,这里传递时TreeSet对象中的各个元素,只要能运行下去,TreeSet对象中有几个元素,就会调用子类的 compareTo方法几次来进行比较。比如将元素1作为参数传递进去,如果元素1是父类对象,注意不要讲该元素转换成子类对象,这样肯定会出异常的,所以只能将TreeSet对象要添加的子类对象转换成父类对象。
代码如下:
import java.util.TreeSet;
public class CompareTo1 {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("p1", 20));
ts.add(new Person("p2", 20));
ts.add(new Person("p3", 20));
ts.add(new Student("s1", 20));
ts.add(new Student("s1", 21));
ts.add(new Student("s1", 22));
System.out.println(ts);
}
}
class Person implements Comparable{
String name;
int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public int compareTo(Object o) {
Person p = (Person)o;
System.out.println("personCmp: " + this + " cmp " + p);
return name.compareTo(p.name);
}
public String toString(){
String s = name + "---" + age;
return s;
}
}
class Student extends Person {
public Student(String name, int age){
super(name, age);
}
// public int compareTo(Object o){
// Student s = (Student)o;
// System.out.println("StudentCmp" + this + " cmp " + s);
// return age - s.age;
// }
public int compareTo(Object o){
Person s = (Person) o;
System.out.println("StudentCmp" + this + " cmp " + s);
return age - s.age;
}
}
作者:
hyz123456
时间:
2013-10-6 12:39
执行到父类对象的时候调用父类的compareTo方法
执行到子类对象的时候调用子类的compareTo方法
作者:
麦子
时间:
2013-10-6 14:48
当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个方法的
作者:
乔兵
时间:
2013-10-6 16:16
问题解决后,请修改帖子分类为:提问结束
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2