黑马程序员技术交流社区

标题: TreeSet的一个问题 [打印本页]

作者: 余雷    时间: 2013-5-6 19:10
标题: TreeSet的一个问题
本帖最后由 余雷 于 2013-5-8 20:41 编辑

TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
作者: 刘学明       时间: 2013-5-6 20:18
那要看您是想让程序有何需求 ,还是按什么排序 对排序有什么要求,
对于同时存储有父类和子类的个人感觉还是用比较器方式排序比较好用。

写了一段有子父类存储到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. }

复制代码

作者: ZhaoYuBetter    时间: 2013-5-6 23:21
new TreeSet<Parent> 时,可以放入父类与子类,典型的 Object;
如果 new TreeSet<Child>时,就只能放子类了;比较的时候。是根据 多态的特性,子类重写了父类的 comapreTo就是使用子类的。没有则使用父类的;
作者: 孙金鑫    时间: 2013-5-7 00:23

  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方法,根据多态的特性实现*/

复制代码

作者: 黄玉昆    时间: 2013-5-7 21:56

如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢




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