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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余雷 中级黑马   /  2013-5-6 19:10  /  1664 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余雷 于 2013-5-8 20:41 编辑

TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
那要看您是想让程序有何需求 ,还是按什么排序 对排序有什么要求,
对于同时存储有父类和子类的个人感觉还是用比较器方式排序比较好用。

写了一段有子父类存储到TreeSet的小程序
代码示例:
  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;

  4. class Person{         //定义一个人对象
  5.         private int age;
  6.         private String name;
  7.         Person(String name,int age)
  8.         {
  9.                 this.name = name;
  10.                 this.age=  age;
  11.         }
  12.         public String getName()
  13.         {
  14.                 return name;
  15.         }
  16.         public int getAge(){
  17.                 return age;
  18.         }
  19. }

  20. class Student extends Person   //定义一个学生对象
  21. {
  22.         Student(String name,int age){
  23.                 super(name,age);
  24.         }
  25. }

  26. public class TreeSetTest{
  27.         public static void main(String[] args)
  28.         {
  29.                 TreeSet<Person> ts = new TreeSet<Person>(new NameComparator());//将按姓名排序的比较器传给TreeSet构造函数。
  30.                 ts.add(new Person("bcds",32));
  31.                 ts.add(new Person("liuliu",22));
  32.                 ts.add(new Student("asdf",32));
  33.                 ts.add(new Student("asdf",42));
  34.                 ts.add(new Student("egfds",42));
  35.                
  36.                 for(Iterator<Person> it = ts.iterator();it.hasNext();)
  37.                 {
  38.                         Person p = it.next();
  39.                         System.out.println(p.getName()+".."+p.getAge());
  40.                 }
  41.         }
  42. }

  43. class NameComparator implements Comparator<Person> //用比较器的时候可以比子类也可以比父类,
  44.                                                                                           //如果同时存储子父类对象的时候,要用父类的泛型进行限定。
  45. {
  46.         public int compare(Person p1,Person p2)
  47.         {
  48.                 int num = p1.getName().compareTo(p2.getName());
  49.                 if(num==0)
  50.                         return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
  51.                 return num;
  52.         }
  53. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
new TreeSet<Parent> 时,可以放入父类与子类,典型的 Object;
如果 new TreeSet<Child>时,就只能放子类了;比较的时候。是根据 多态的特性,子类重写了父类的 comapreTo就是使用子类的。没有则使用父类的;

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

  1. import java.util.*;

  2. class Person implements Comparable<Person>
  3. {         //定义一个人对象
  4.         private int age;
  5.         private String name;
  6.         Person(String name,int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age=  age;
  10.         }
  11.         public String getName()
  12.         {
  13.                 return name;
  14.         }
  15.         public int getAge(){
  16.                 return age;
  17.         }
  18.        
  19.         public int compareTo(Person p)
  20.         {
  21.                 //在这里就不做比较是不是Person及其子类型了。

  22.                 int num = new Integer(this.age).compareTo(new Integer(p.age));
  23.                 if(num == 0)
  24.                         return this.name.compareTo(p.name);
  25.                 return num;
  26.         }
  27. }

  28. class Student extends Person   //定义一个学生对象
  29. {
  30.         Student(String name,int age){
  31.                 super(name,age);
  32.         }
  33. }

  34. public class TreeSetTest{
  35.         public static void main(String[] args)
  36.         {
  37.                 TreeSet<Person> ts = new TreeSet<Person>();
  38.                 ts.add(new Person("bcds",32));
  39.                 ts.add(new Person("aliuliu",22));
  40.                 ts.add(new Student("asdf",32));
  41.                 ts.add(new Student("fsdf",42));
  42.                 ts.add(new Student("egfds",42));
  43.                
  44.                 for(Iterator<Person> it = ts.iterator();it.hasNext();)
  45.                 {
  46.                         Person p = it.next();
  47.                         System.out.println(p.getName()+".."+p.getAge());
  48.                 }
  49.         }
  50. }
  51. /*直接在父类中实现Comparable复写compareTo方法,根据多态的特性实现*/

复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马