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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 青苹果 中级黑马   /  2014-5-6 15:41  /  1466 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class TreeSetDemo
{
public static void main(String[] args)
{
  TreeSet ts = new TreeSet();
  ts.add(new Student("lisi02",22));
  ts.add(new Student("lisi007",20));
  ts.add(new Student("lisi09",19));
  Iterator it = ts.iterator();
  while(it.hasNext())
  {
   Student stu = (Student)it.next();
   System.out.println(stu.getName()+"..."+stu.getAge());
  }
}
}


class Student implements Comparable//该接口强制让学生具备比较性。
{
private String name;
private int age;
Student(String name,int age)
{
  this.name = name;
  this.age = age;
}
public int compareTo(Object obj)
{
   
  if(!(obj instanceof Student))
   throw new RuntimeException("不是学生对象");
  Student s = (Student)obj;
  System.out.println(this.name+"....compareto....."+s.name);
  if(this.age>s.age)
   return 1;
  if(this.age==s.age)
  {
   return this.name.compareTo(s.name);
  }
  return -1;
}

public String getName()
{
  return name;
}
public int getAge()
{
  return age;
}
}




public int compareTo(Object obj)  这个也不是构造函数   也没有看他调用他的语句  他是怎么把TreeSet ts 传进去呢?  请教下大神们

5 个回复

倒序浏览
TreeSet类,有一个默认的构造函数TreeSet(); 该构造函数会调用compareTo()方法对加进的元素进行比较以对元素排序(默认是按自然顺序排序),
您复写了compareTo()方法,所以在add()方法添加元素时,会按您复写的compareTo()方法进行比较,自然需要传入参数。
不过TreeSet ts中ts只是此类对象的引用,用于调用方法等,传入的应该是通过new创建的对象,例:new Student("lisi02",22)。
回复 使用道具 举报
thinkervsruler 发表于 2014-5-6 17:01
TreeSet类,有一个默认的构造函数TreeSet(); 该构造函数会调用compareTo()方法对加进的元素进行比较以对元 ...

还有一个compare    如果comparator 接口被实现了  那么TreeSet();就会调用compare 是吧
回复 使用道具 举报
青苹果 发表于 2014-5-6 17:22
还有一个compare    如果comparator 接口被实现了  那么TreeSet();就会调用compare 是吧 ...

只调用compareTo()方法进行元素比较,你参考下JDK API中TreeSet()构造方法就知道了
回复 使用道具 举报
首先,指出一点小问题,程序在用TreeSet时,没有加泛型。
继续说正题,利用TreeSet实现对自定义类型进行排序时,通常有两种方式。
方式一、让自定义的类实现Comparable接口,在类中重写compareTo(T o)方法,其中比较的对象是this和o两个
方式二、TreeSet的构造方法中有一种:TreeSet(Comparator comparator)的方法,利用匿名内部类实现,建立该接口的实现类,重写compare(T o1,T o2)方法,比较o1和o2两个对象
代码如下:
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>(){
@override compare(Student s1,Studnet s2)
});

回复 使用道具 举报
好的 :):):)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马