类的可比较性Comparable和比较器Comparator
Posted coderDu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的可比较性Comparable和比较器Comparator相关的知识,希望对你有一定的参考价值。
1. Comparable
Comparable
源码如下:
public interface Comparable<T> {
public int compareTo(T o);
}
类实现该接口意味着该类是可比较的,其方法返回值-1,0,1
分别表示当前类比进行比较的类(方法参数)小、相等、大。
实现该接口意味着该类有了‘可比较’的属性。
2. Comparator
Comparator
部分源码如下:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
...
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
...
public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {
return Collections.reverseOrder();
}
...
如果对没有实现Comparable
接口的类进行排序,那么可以使用比较器Comparator
实现。他可以选出类中一些“信息”进行比较,比如变量甚至哈希码。
如源码所示该接口是函数式接口,其唯一抽象方法是int compare(T o1,T o2)
,其返回值-1,0,1
分别表示第一个参数比第二个参数小、相等、大。
如果对一个实现Comparator
的类指定比较器进行比较的时候,比较规则与比较器对齐。示例如下:
class DemoClass implements Comparable{
public int a;
public DemoClass(int a) {
this.a = a;
}
@Override
public int compareTo(Object o) {
return (a<((DemoClass)o).a)?-1:(a==((DemoClass)o).a?0:1);
}
@Override
public String toString() {
return a+"";
}
}
public class Test2 {
public static void main(String[] args) {
List<DemoClass> list=new ArrayList();
list.add(new DemoClass(3));
list.add(new DemoClass(1));
list.add(new DemoClass(2));
System.out.println(list);
//用元素自身比较属性进行排序
Collections.sort(list);
System.out.println(list);
//用比较器进行排序
Collections.sort(list,(x,y)->{//此时x和y都是list中元素类型
return x.a<y.a?1:(x.a==y.a?0:-1);//逻辑与类定义的比较方式相反
});
System.out.println(list);
}
}
output:
[3, 1, 2]
[1, 2, 3]
[3, 2, 1]
以上是关于类的可比较性Comparable和比较器Comparator的主要内容,如果未能解决你的问题,请参考以下文章
Comparable和Comparator的区别 :Java 类的比较
java学习笔记13--比较器(ComparableComparator)
java lang(Comparable接口) 和java util(Comparator接口)分析比较