黑马程序员技术交流社区

标题: 请教,使用TreeSet集合存储自定义对象时,遇到不解之处 [打印本页]

作者: 乔建国    时间: 2012-5-2 22:24
标题: 请教,使用TreeSet集合存储自定义对象时,遇到不解之处
在下面这个类中实现了Comparable接口,并重写了该接口中的compareTo()方法。
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo{
public static void main(String args[]){
     TreeSet ts=new TreeSet();
     ts.add(new Student("zhangsan01",22));
     ts.add(new Student("zhangsan007",20));
     ts.add(new Student("zhangsan09",19));
     ts.add(new Student("zhangsan001",24));
     ts.add(new Student("zhangsan08",23));
     ts.add(new Student("zhangsan011",25));   //?
     ts.add(new Student("zhangsan012",26));   //?
     ts.add(new Student("zhangsan015",27));   //??  疑问 zhangsan011、zhangsan012、zhangsan015这个三个对象存入时,这里自动择中比较是怎么择的呢? 运行结果我以看到了,不解是什么规律
     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 String getName(){
   return name;
  }
  public int getAge(){
   return 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 0;
      return -1;
    }
   }
}

作者: 贾联国    时间: 2012-5-2 23:36
这里的student已经实现了Comparable接口,在实现接口方法的时候,是使用的年龄排序
if(this.age>s.age)
      return 1;
      if(this.age==s.age)
      return 0;
      return -1;//这段代码的意思就是this的年龄比参加比较s的年龄大,compareTo就返回真,相等返回0,小于就返回-1。

作者: 乔建国    时间: 2012-5-2 23:43
贾联国 发表于 2012-5-2 23:36
这里的student已经实现了Comparable接口,在实现接口方法的时候,是使用的年龄排序
if(this.age>s.age)
   ...

谢谢 ,答非我所问
作者: 贾联国    时间: 2012-5-3 00:03
乔建国 发表于 2012-5-2 23:43
谢谢 ,答非我所问

既然实现了Comparable,就用实现Comparable的方法比较,这实现的方法是比年龄,和名字没关系,他叫什么都随便,我可能没理解你说的到底是什么意思。
“疑问 zhangsan011、zhangsan012、zhangsan015这个三个对象存入时,这里自动择中比较是怎么择的呢?”
”自动择中“是什么?
作者: 何阳    时间: 2012-5-3 00:10
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 0;
      return -1;
          //修改代码:
          int temp=this.age-s.age;
          return  temp==0?this.name.length()-s.name.length():temp;

    }
   }
}
//因为你复写了compareTo()方法,所以在TreeSet存入对象时,用的是比较年龄的大小来排序的。
//建议,你增加次要判断,如果你存入的2个人年龄相同,岂不是不能存进去了,一个班里面难道
//没有相同年龄的人吗?
//修改代码:





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