import java.util.Set ;
import java.util.TreeSet ;
class Person implements Comparable<Person>{
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:" + this.name + ";年龄:" + this.age ;
}
public int compareTo(Person per){
if(this.age>per.age){
return 1 ;
}else if(this.age<per.age){
return -1 ;
}else{
return this.name.compareTo(per.name) ;
}
}
};
public class test01{
public static void main(String args[]){
Set<Person> allSet = new TreeSet<Person>() ;
allSet.add(new Person("张三",30)) ;
allSet.add(new Person("李四",31)) ;
allSet.add(new Person("王五",32)) ;
allSet.add(new Person("王五",32)) ;
allSet.add(new Person("王五",32)) ;
allSet.add(new Person("赵六",33)) ;
allSet.add(new Person("孙七",33)) ;
System.out.println(allSet) ;
}
};
这段代码中的compareTo方法的使用看不明白:
public int compareTo(Person per){
if(this.age>per.age){
return 1 ;
}else if(this.age<per.age){
return -1 ;
}else{
return this.name.compareTo(per.name) ;
}这里的比较this.age>per.age,到底是拿谁和谁比呢?还有最后的return this.name.compareTo(per.name)怎么理解

解决方案 »

  1.   

    this.age表示的是当前对象,也就是调用compareTo的对象,this.age>per.age就是比较当前对象跟你传入的per对象的age大小,而最后的应该是age相同然后比较name字段。
      

  2.   

    当前对象和传入的对象不是一个么,比如 allSet.add(new Person("张三",30)) ,这个对象增加的时候和谁比?
      

  3.   

    是和将要被比较的对象比
    allSet发现你要加入一个对象,而set只能保存不同的对象,于是他就要把新加进来的对象和之前的对象比较是否有相同的,如果是相同的就不要加,但是,因为你这个类是自定义的,set最开始不知道如何来比较你这个对象,所以你必须实现Comparable方法,这样set就知道既然你实现了这个方法,那么set就会用你这个方法来和其他已存在的对象比较,所以此时,传入的对象其实就是set中已存在的那些对象
      

  4.   

    Comparable排序用的不是比较相同不相同,Set中比较相同不相同是比较hashCode和equals方法。第一次加张三的时候不会调用compareTo方法,等你加李四的时候就会调张三.comparTo李四,把序排好,如果顺序是张三,李四下次你加王五的时候就会调用李四.compareTo王五
      

  5.   

    Comparable排序用的不是比较相同不相同,Set中比较相同不相同是比较hashCode和equals方法。第一次加张三的时候不会调用compareTo方法,等你加李四的时候就会调张三.comparTo李四,把序排好,如果顺序是张三,李四下次你加王五的时候就会调用李四.compareTo王五
      

  6.   

    当前对象和传入的对象当然不是同一个对象了
    TreeSet是用TreeMap来实现的
    allSet.add(new Person("张三",30)) 这个对象是跟这个tree上的根节点上的对象开始循环比较,一直到找到合适的位置放下
      

  7.   

    Comparable排序用的不是比较相同不相同,Set中比较相同不相同是比较hashCode和equals方法。第一次加张三的时候不会调用compareTo方法,等你加李四的时候就会调张三.comparTo李四,把序排好,如果顺序是张三,李四下次你加王五的时候就会调用李四.compareTo王五
      

  8.   

    http://byandby.iteye.com/blog/651385
    找到一篇文章,lz可以参考一下。最后的return this.name.compareTo(per.name)是指年龄相同的时候,比较名字。TreeSet是要排序的,因此要分出个先后。至于compareTo等调试一下再下结论。
      

  9.   

    Debug了一下,this.age是后加入TreeSet中的元素,而per.age则是之前存在于TreeSet中的元素。比如加入第一个new Person("王五",32)时,它会依次将new Person("王五",32)和之前存在new Person("张三",30)) 、new Person("李四",31)进行比较,进行去重、排序。最终的输出结果为[姓名:张三;年龄:30, 姓名:李四;年龄:31, 姓名:王五;年龄:32, 姓名:孙七;年龄:33, 姓名:赵六;年龄:33]。