先大体看一下这两个接口各自的区别:
-
Comparable是排序接口,常用于自然排序;若一个类实现了Comparable接口,就意味着“该类支持排序”。
-
Comparator是比较器,常用于需要对排列的顺序进行精确控制的情况;我们若需要控制某个类的多个对象的次序,可以建立一个“该类的比较器”来进行排序。
通过代码来细看它们的不同实现与作用
内部比较器 comparable 主要代码
public class Dayimplements Comparable {
private int year;
public Day(int year) {
this.year = year;
}
/**
* @desc 重写compareTo函数。通过year来比较,如果return 的大于0 则当前类排在比较类的后面
* 如果return 的小于0 则当前类排在比较类的前面
*/
public int compareTo(Day otherDay) {
return year - otherDay.year;
}
@Override
public String toString() {
return "year=" +year;
}
public int getYear() {
return year;
}
}
外部比较器 comparator 主要代码
public class AscOperation implements Comparator<Day> {
/**
* @desc compare函数。通过year来比较,如果return 的大于0 则前一位排在后一位的后面
* 为升序,如果return 的小于0 则前一位排在后一位的的前面,为降序
*/
public int compare(Day day1, Day day2) {
return day1.getYear() - day2.getYear();
}
}
客户端调用代码
public class Main {
public static void main(String[] args){
List days =new ArrayList();
days.add(new Day(2018));
days.add(new Day(2017));
days.add(new Day(2019));
//内部实现排序
Collections.sort(days);
System.out.printf("list:%s\n",days);
//依靠外部方法实现排序
Collections.sort(days,new DescOperation());
System.out.printf("list:%s\n",days);
Collections.sort(days,new AscOperation());
System.out.printf("list:%s\n",days);
}
}
网友评论