Comparable接口和Comparator接口
Comparable和Comparator接口简介
Comparable接口和Comparator接口的作用 : 用于给实现类规范比较(排序)的方法.
首先看两个接口的代码:
Comparable接口
public interface Comparable<T> {
public int compareTo(T o);
}
Comparator接口
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
//其他默认方法和静态方法;
//......
}
比较两个接口的代码,我们可以看到:
1.Comparable的compareTo(T)方法只有1个参数,.
2.Comparator接口的compare(T o1, T o2)方法有两个参数, 有@FunctionalInterface接口,所以有Lambda表达式的用法
所以,
Comparable只能在类内部实现比较功能,让想让实现比较功能的类自身实现Comparable接口
Comparator可以做成比较器类,让比较器类实现Comparator接口
Comparator接口为什么有多个抽象方法还被标注为函数式接口?
compare(T o1, T o2)方法外的另一个抽象方法equals(Object obj)是Object类的方法,因此所有类都有该方法,不影响Comparator作为函数式接口(瞎猜的).
*接口并非继承自Object,只是接口定义了一套与Object完全相同的方法(详细内容可以网上查询一下,这里暂不讨论)
如何让类实现比较功能?
让该类实现Comparable接口,并重写接口内的compareTo(T o)方法,示例如下
public Person implaments Comparable{
private int id;
private String name;
//......构造函数及get/set方法省略
@Override
public int compareTo(Person p) {
int result = this.id-p.getId();
if(result<0) return -1;
if(result > 0) return 1;
return 0;
}
}
这样,该Person类就具备了比较的功能,当要给ArrayList<Person> list排序的时候,就可以调用Collections.sort(List T)方法,来实现对集合list的排序.
如果类没有实现比较功能,怎么给装有该类的List集合排序?
答案是: 使用比较器(Comparator)
有两种使用方法:
一.调用Collections.sort(List T, Comparator<? super T> c)重载方法,传入list和比较器对象实现排序
Collections.sort(list1, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int a = Integer.parseInt(o1);
int b = Integer.parseInt(o2);
if (a>b) return 1;
if (a<b) return -1;
return 0;
}
});
二.使用List的sort(Comparator<? super T> c)方法,传入比较器对象来排序
list1.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int a = Integer.parseInt(o1);
int b = Integer.parseInt(o2);
if (a>b) return 1;
if (a<b) return -1;
return 0;
}
)
因为Comparator接口是函数式接口,所以List的sort()方法和Collections的sort()方法,都可以用Lambda表达式的写法.
Collections.sort(list1, (a,b) -> {
//......省略
return 0;
});
list1.sort((a, b) -> {
//......省略
return 0;
});
fff

浙公网安备 33010602011771号