import java.util.Comparator;
import java.util.TreeSet;
/*
 当treeset集合中的元素不具备比较功能,或者具备的比较功能不是所需要的
 例如person对象中的自然排序是按照年龄进行排序的,但现在的需求是按照姓名进行排序,改源代码的方式不可取
 
 该如果解决这个问题呢?
 既然元素具备的比较方式不满足应用,这时可以让集合自身具备比较性,需要集合一初始化就具备比较功能,因为要在
 添加元素前具备,就要在构造函数中进行初始化
 
 只要将一个实现了comparator接口的子类对象作为参数传递给treeset集合的构造函数即可,这样该集合就具备了比较功能
 
 treeset排序方式有两种
 第一种:让元素自身具备比较功能,其实就是让元素实现Comparable接口,覆盖compareTo方法,这称为元素的自然排序
 第二种:当元素自身不具备比较性,或者具备的比较性不是所需要的,这时可以让集合自身具备比较性
   定义一个比较器,其实就是定义一个类,实现Comparator接口,覆盖compare方法
   经Comparator接口的子类对象作为参数传递给treeset集合的构造函数
   
   当元素具备比较性,同时集合具有比较器时,以比较器为主
   
 建议使用第二种排序方式
 
 一般在描述一个对象时,如果该对象封装了具体的数据,会出现很多这样的对象,比如:员工,学生对象
 这时就需要进行容器的存储,那么描述该类对象时,就一定要复写几个方法:
 1.hashcode()
 2.equals()
 3.toString()
 4.最好实现Comparable接口,让该类实现自然排序功能
 
 建立对象自身判断是否相同的依据,同时让对象具备基本的比较性*/
public class TreeSetDemo{

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  TreeSet ts=new TreeSet(new CompareByName());
  ts.add(new Person("lisi3",20));
  ts.add(new Person("lisi4",21));
  ts.add(new Person("lisi6",29));
  ts.add(new Person("lisi9",23));
  ts.add(new Person("lisi1",25));
  
  System.out.println(ts);
 }

}
//自定义一个比较器
class CompareByName implements Comparator
{
 public int compare(Object o1,Object o2)
 {
  Person p1=(Person)o1;
  Person p2=(Person)o2;
  
  int num=p1.getName().compareTo(p2.getName());
  return num==0? p1.getAge()-p2.getAge():num;
 }
}
class Person implements Comparable
{
 String name;
 int age;
 Person(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
 //人的自然排序是按照年龄进行排序
 public int compareTo(Object obj)
 {
  Person p=(Person)obj;
  //int num=this.age-p.age;
  int num=new Integer(this.age).compareTo(new Integer(p.age));
  return num==0? this.name.compareTo(p.name):num;
  /*if(this.age>p.age)
   return 1;
  else if(this.age<p.age)
   return -1;
  else
   return 0;*/
 }
 public int hashCode()
 {
  //System.out.println(this+".....hashCode");
  final int NUMBER=39;
  return name.hashCode()+age*NUMBER;
 }/**/
 public boolean equals(Object obj)
 {
  //System.out.println(this+"....equals...."+obj);
  if(this==obj)
   return true;
  if(!(obj instanceof Person))
   return false;
  Person p=(Person)obj;
  return this.name.equals(p.name) && this.age==p.age;
 }
 public String getName()
 {
  return name;
 }
 public int getAge()
 {
  return age;
 }
 public String toString()
 {
  return name+"::"+age;
 }
 
}

run:

[lisi1::25, lisi3::20, lisi4::21, lisi6::29, lisi9::23]