package test1;
import java.util.*;
public class test20080520 {
public test20080520() {
}
public static void main(String[] args) {
TreeSet tset = new TreeSet();
// tset.add("d");
// tset.add("t");
// tset.add("a");
// tset.add("s");
// tset.add("z");
// tset.add("n");
// tset.add("T");
// tset.add("e");
// tset.add("I");
// tset.add("p");
tset.add(new Students(2,"zhangshan"));
tset.add(new Students(1,"lisi"));
tset.add(new Students(3,"wangwu"));
Iterator it = tset.iterator();
while(it.hasNext()){
System.out.println(it.next().toString());
}
System.out.println(tset);
}
}
class Students implements Comparable{
int num;
String name;
Students(int num,String name){
this.num = num;
this.name = name;
}
public int compareTo(Object o){
Students s = (Students)o;
int ret = num>s.num?1:(num==s.num?0:-1);
if(ret==0){
name.compareTo(s.name);
}
return ret;
}
public String toString(){
return num+":"+name;
}
// static class compareToStudent implements Comparator{
// public int compare(Object o1,Object o2){
// Students s1 = (Students)o1;
// Students s2 = (Students)o2;
// int ret = s1.num>s2.num?1:(s1.num==s2.num?0:-1);
// if(ret ==0){
// ret = s1.name.compareTo(s2.name);
// }
// return ret;
// }
// }
}
comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像C++ STL中的函数对象一样。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。
而Comparator的作用有两个:
1. 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序
2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序