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]
转载于:https://blog.51cto.com/asalinux/645740