TreeSet对元素进行比较,我让元素自身具备了比较功能
我实现了Comparable接口里,并覆盖compareTo方法,不明白的是compareTo返回一个int型的数值有什么用?
是怎么根据这个返回值类型进行排序的?
public class Person implements Comparable
{
private int age;
private String name;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getname()
{
return name;
}
public int getage()
{
return age;
}
public int hashCode()
{
return name.hashCode()+age;
}
public boolean equals(Object obj)
{
Person ob = (Person)obj;
return this.name == ob.name && this.age == ob.age;
}
public int compareTo(Object obj)
{
System.out.println("obj...aaaaa");
Person p = (Person)obj;
int tim = this.age-p.age;
return tim==0?this.name.compareTo(p.name):tim;
}

}
===================================================================================疑惑2:
为了让集合自身具备比较方法,另外定义了一个类实现comparator接口,将该类对象作为参数传递给TreeSet集合的构造函数,comparator有两个方法:compare和equals
为什么我只覆盖了compare而已,但却能通过编译却程序没有问题?
接口中的方法不用全部覆盖么?
import java.util.Comparator;
public class ComparaByage implements Comparator
{
public int compare(Object xx,Object oo)
{
Person p1 = (Person)xx;
Person p2 = (Person)oo;
int tim =p1.getage() - p2.getage();
return tim==0?p1.getname().compareTo(p2.getname()):tim;
}
}

解决方案 »

  1.   

    哇哈哈哈,查了好久了借到TreeSet底层是二叉树结构,正在看。坑爹的教材书了对二叉树居然只字未提。
      

  2.   

    楼主这就涉及到底层代码了,第一种方式让类自身有比较性实现Comparable中的compareTo方法,返回的int类型,此时TreeSet<Person>集合的add方法底层调用了Map的put方法 然后实现 hashCode, equals,compareTo方法,,JAVA工厂师定义compare返回负数的时候,就往树的左边放,正数往树的右边放,相等就替代.了解就行了,没必要深究
        
     
      

  3.   

    关于第二个问题 查阅API中的comparator中的equals方法图中提到,仅当传入参数也为comparator的对象时运用相同排序规则时,提高性能的,所以没必要重写
      

  4.   

    自身对象与比较对象比较大小,
    0表示一样大,负数表示小于,正数表示大于关于只实现一个,我想是ComparaByage类已经拥有了继承自Object的equals实现版本,所以没有自行覆盖的话不再强制了
      

  5.   

    重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。 

    这句没能理解能否通俗点讲,或者搞个小例子给我撸一撸
      

  6.   

    这个我也不知道,我理解的是让传入的Comparator对象和现在的Comparator的重写的compare方法一致.这个真没必要深究.