黑马程序员技术交流社区
标题:
集合中元素比较的问题
[打印本页]
作者:
为你而去
时间:
2014-4-8 20:36
标题:
集合中元素比较的问题
TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那么放入元素时怎么跟前边的元素比较呢,比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
作者:
zhangbingyuan
时间:
2014-4-8 21:08
本帖最后由 zhangbingyuan 于 2014-4-8 22:24 编辑
啊呀 哥们 ,费了我好大 的功夫总算调试完了。结果就是子父类对象都是可以同时存在TreeSet集合里边的,只要你将子父类实现Comparable接口,并用正确的方法复写compareTo方法就行。具体代码如下,用来调试的友好信息也加上了,对你理解这个程序有帮助,你可以直接复制代码去运行试试
package com.zby;
import java.util.Iterator;
import java.util.TreeSet;
class Parent implements Comparable
{
int age = 0;
public Parent(int age)
{
this.age = age;
System.out.println("调用父类构造函数!");
}
public int compareTo(Object o)
{
if(o instanceof Child)//如果是子类,就将object强转为子类对象.
注意:这里“判断是否是子类对象”的操作必须在前,因为,子类也是一个父类,不然,会总是跟父类比较的。
{
System.out.println("子类对象跟子类对象比较");
Child c = (Child)o;
System.out.println("子类..."+this.age+" <---> 子类..."+ c.age);
return this.age>c.age? 1 : ( this.age==c.age ? 0 : -1);
}
else if(o instanceof Parent)//如果是父类,就将object强转为父类对象
如果将“判断是否是父类”的 操作放在前面,那么总会将object转换为父类,根本执行不到“判断是否是子类”的操作
{
System.out.println("子类对象跟父类对象比较");
Parent p = (Parent)o;
System.out.println("子类..."+this.age+" <---> 父类..."+ p.age);
return this.age>p.age? 1 : ( this.age==p.age ? 0 : -1);
}
return 5;
}
@Override
public String toString()
{
return "Parent...." + age;
}
}
class Child extends Parent implements Comparable
{
public Child(int age)
{
super(age);
System.out.println("调用了子类构造函数!");//通过在子父类的构造函数中加入这个语句,可以清晰地看到建立子类对象的过程
}
public int compareTo(Object o)
{
if(o instanceof Child)//如果是子类,就将object强转为子类对象
{
System.out.println("子类对象跟子类对象比较");
Child c = (Child)o;
System.out.println("子类..."+this.age+" <---> 子类..."+ c.age);
return this.age>c.age? 1 : ( this.age==c.age ? 0 : -1);
}
else if(o instanceof Parent)//如果是父类,就将object强转为父类对象
{
System.out.println("子类对象跟父类对象比较");
Parent p = (Parent)o;
System.out.println("子类..."+this.age+" <---> 父类..."+ p.age);
return this.age>p.age? 1 : ( this.age==p.age ? 0 : -1);
}
return 5;
}
@Override
public String toString() //复写toString方法,方便输出对象信息
{
return "Child...." + age;
}
}
public class TreeSetTest
{
public static void main(String[] args)
{
TreeSet set = new TreeSet();
set.add(new Parent(3));
System.out.println("");//为了让输出结果简单明了,特地加上了空行
set.add(new Child(8));
System.out.println("");
set.add(new Parent(5));
System.out.println("");
set.add(new Child(1));
System.out.println("");
set.add(new Parent(2));
System.out.println("");
System.out.println(set.size());
System.out.println();
Iterator i = set.iterator();//定义迭代器,输出set集合中的元素
while(i.hasNext())
{
System.out.println(i.next());
}
}
}
输出结果如下:(我这里是按照年龄大小排序的)
调用父类构造函数!
父类对象跟父类对象比较
父类...3 <---> 父类...3
调用父类构造函数!
调用了子类构造函数!
子类对象跟父类对象比较
子类...8 <---> 父类...3
调用父类构造函数!
父类对象跟父类对象比较
父类...5 <---> 父类...3
父类对象跟子类对象比较
父类...5 <---> 子类...8
调用父类构造函数!
调用了子类构造函数!
子类对象跟父类对象比较
子类...1 <---> 父类...5
子类对象跟父类对象比较
子类...1 <---> 父类...3
调用父类构造函数!
父类对象跟父类对象比较
父类...2 <---> 父类...5
父类对象跟父类对象比较
父类...2 <---> 父类...3
父类对象跟子类对象比较
父类...2 <---> 子类...1
5
Child....1
Parent....2
Parent....3
Parent....5
Child....8
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2