类的可比较性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接口)分析比较

Java中Comparable和Comparator接口区别分析

容器随笔

comparable和comparator区别