Comparator也叫外部比较器,常在使用Collections工具类进行集合排序的时候使用。外部比较器Comparator可以理解为一个专用的比较器,当集合中的对象不支持自比较或者比较的功能不能满足程序的需求时,可以写一个比较器来完成两个对象之间的比较。
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
public static void main(String[] args) {
LinkedList<Pig> ts = new LinkedList<>();
ts.add(new Pig("话风", 15));
ts.add(new Pig("狐仙", 2));
ts.add(new Pig("苏果", 23));
ts.add(new Pig("环形", 10));
ts.add(new Pig("吉吉", 19));
//使用Collections类进行排序
//Collections的static void sort(List<T> list, Comparator c) 使用的就是Comparator比较器
Collections.sort(ts, new Compa());
//遍历
for(int i = 0; i < ts.size(); i++){
System.out.println(ts.get(i).name+"----"+ts.get(i).age);
}
//和Comparable内部比较器相比,集合中装的元素对应的类不用去实现Comparable类
//但是需要额外的去实现Comparator比较器
}
//集合装取的元素类
class Pig {
public String name = "默认";
public int age = 0;
public Pig(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
//实现comparator接口,该类作为一个比较器类使用
class Compa implements Comparator{
@Override
public int compare(Object o1, Object o2) {
int age1 = ((Pig)o1).age;
int age2 = ((Pig)o2).age;
int flag = (age1>age2 ? 1 :(age1==age2 ? 0 : -1));
/* 以两个猪的年龄来比较
* 如果o1猪的年龄大于o2猪的年龄,返回正数
* 如果o1猪的年龄等于o2猪的年龄,返回0
* 如果o1猪的年龄小于o2猪的年龄,返回负数
*/
return flag;
}
}
Comparable又叫内部比较器,常使用在TreeSet排序时。TreeSet类在添加的元素的时候不是无序的,而是会进行升序排序的,默认是按照自然升序排列的。因为TreeSet类在实现Set接口的同时,也实现了SortedSet接口,所以TreeSet类是一个具有排序功能的类。
如果想定义自己的排序方式,方法也很简单,就是让加入TreeSet集合的对象所属类实现Comparable接口。而我们使用String,Intereger类等也会有排序的效果,是因为这些类已经实现了Comparable接口。
import java.util.TreeSet;
public static void main(String[] args) {
TreeSet<Bird> ts = new TreeSet<>();
ts.add(new Bird(15));
ts.add(new Bird(5));
ts.add(new Bird(100));
ts.add(new Bird(20));
//遍历,使用foreach
for(Bird b : ts){
System.out.println(b.age);
}
}
//鸟类实现Comparable接口,并重写compareTo方法
class Bird implements Comparable {
public int age = 0;
public Bird(int age) {
super();
this.age = age;
}
@Override
public int compareTo(Object o) {
int tage = ((Bird)o).age; //强制转换获取鸟的年龄
int flag = (tage > this.age ? 1:(tage == this.age ?0:-1));
/* 比较两个鸟的年龄,
* 若o的年龄大于this的年龄返回正数,
* 若两个年龄一样大返回0
* 若o的年龄小于this的年龄返回负数
*/
return flag;
}
}