package cn.temp;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* 求解接口Comparator和Comparable的区别(请详细些)?
* @author Cuilitang
*
*/
public class Temp {
public static void main(String[] args) {
Set<Student> treeset = new TreeSet<Student>();
treeset.add(new Student(1,"张三"));
treeset.add(new Student(2,"李四"));
treeset.add(new Student(3,"王五"));
Iterator<Student> it = treeset.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
/*
* 此程序中Student 对象被存储进treeset集合中,但是treeset集合自身并没有比较对象先后顺序的比较器这样就需要调用对象自身的比较器来进行比较。
* Person是自定义对象,为了能有比较性必须的继承使对象有比较性特性的接口:Comparable,这种情况很常见,比如要想让对象能够序列化就需要实现Serializable。
* TreeSet集合是有序的所以迭代出来的元素就是按照Student对象自身的比较器比较的结果.
* 若想测试,可以修改一下Student类中的compareTo()试一试。
*/
class Student implements Comparable<Student>{
int id;
String name;
Student(int id, String name){
this.id = id;
this.name = name;
}
@Override
public int compareTo(Student s1) { //Student类的自然排序
// TODO Auto-generated method stub
int x = s1.id - this.id; //比较年龄
int y = s1.name.compareTo(this.name);//比较年龄,String实现了Comparable接口,并重写了conpareTo方法
return x == 0 ? y:x;
}
@Override
public String toString(){
return id + "+" + name +"\t";
}
}
package cn.temp;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* 求解接口Comparator和Comparable的区别(请详细些)?
* @author Cuilitang
*
*/
public class CopyOfTemp {
public static void main(String[] args) {
Set<Teacher> treeset = new TreeSet<Teacher>(new MyComparetor());
treeset.add(new Teacher(1,"张三"));
treeset.add(new Teacher(2,"李四"));
treeset.add(new Teacher(3,"王五"));
Iterator<Teacher> it = treeset.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class MyComparetor implements Comparator<Teacher>{ //集合的比较器
@Override
public int compare(Teacher t1, Teacher t2) {
// TODO Auto-generated method stub
int x = t1.id - t2.id;
int y = t1.name.compareTo(t2.name);
return x == 0 ? y:x;
}
}
/*
* 此程序中Teacher 对象被存储进treeset集合中.跟上个程序不同,treeset集合自身具有比较器(在new对象时候传入了MyComparetor对象)。
* 这样就不再要求传入的对象必须自身具备比较性。
* TreeSet集合迭代出来的元素就是按照MyComparetor比较器比较的结果.
* 若想测试,可以修改一下MyComparetor类中的compare()试一试。
*/
class Teacher{
int id;
String name;
Teacher(int id, String name){
this.id = id;
this.name = name;
}
@Override
public String toString(){
return id + "+" + name +"\t";
}
}
/**
*综上所述,Compareable接口和Comparetor接口实现的都是比较功能,两者都可以通过重写方法来对对象的顺序进行比较。
*但是它们的调用者不同,具体的比较的方法中接受的参数也不同。
*Compareable是被一个对象调用去与通过参数传进来的另一个对象比较;Comparetor的应用场景到目前为止我所知道的就是在TreeSet集合中,对集合元素进行排序。
*最后很重要的一点:在Treeset集合中,若是两个比较器同时出现Comparetor优先级高于Compareable。
*/