Comparable和 Comparator的联系
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

一、Comparable-基于自然顺序

Comparable 简介

Comparable 是排序接口
若一个类实现了Comparable接口,就意味着“该类支持排序”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。

官方api:

public interface Comparable<T> {
	// 返回值:
    // < 0: 表示 this 指向的对象小于 o 指向的对象
    // == 0: 表示 this 指向的对象等于 o 指向的对象
    // > 0: 表示 this 指向的对象等于 o 指向的对象
   public int compareTo(T o);
}

【规范】类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型

具体例子:

//实例化一个扑克牌类,包括点数和花色。实现Comparable接口,对象类型为poke。
public class poke implements Comparable<poke>{
        public int rank;
        public String suit;
    public poke(int rank,String suit){
        this.rank = rank;
        this.suit = suit;
    }

    //重写compareTo方法,传入参数为poke,取数值进行比较,不管花色
    //返回值当前牌的点数减要比较牌的点数,这里我们认为 null 是最小的
    @Override
    public int compareTo(poke o) {
        if(o == null)return 0;
        // == 0,表示牌相等
        // < 0,表示 p 比较小
        // > 0,表示 q 比较大
        return rank - o.rank;
    }

    public static void main(String[] args) {
        poke p = new poke(1, "♠");
        poke q = new poke(2, "♠");
        poke o = new poke(1, "♠");
        System.out.println(p.compareTo(o));
        System.out.println(p.compareTo(q));
        System.out.println(q.compareTo(p));
    }
}
0
-1
1

二、 Comparator - 基于比较器

Comparator 简介

Comparator 是比较器接口。 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

int compare(T o1, T o2)和上面的x.compareTo(y)类似,定义排序规则后返回正数,零和负数分别代表大于,等于和小于。
官方api:

/**
     * @param o1 the first object to be compared.
     * @param o2 the second object to be compared.
     * @return a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
     * */

public interface Comparator<T> {
	int compare(T o1, T o2);
}

具体例子

import java.util.Comparator;

//一个扑克牌类,包括点数和花色。
public class poke {
    public int rank;
    public String suit;
    
    public poke(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }


    public static class pokecompare implements Comparator<poke> {
        @Override
        // 返回值:
        // 0,表示牌相等
        // < 0,表示前者比较小
        // > 0,表示前者比较大
        public int compare(poke o1, poke o2) {
            if (o1 == o2) return 0;
            if (o1 == null) return -1;
            if (o2 == null) return 1;
            return o1.rank - o2.rank;
        }
    }


    public static void main(String[] args) {
        poke p = new poke(1, "♠");
        poke q = new poke(2, "♠");
        poke o = new poke(1, "♠");
        //比较器。包括重写的compare(poke o1, poke o2) 比较方法
        Comparator<poke> compare = new pokecompare();
        System.out.println(compare.compare(o, q));
        System.out.println(compare.compare(o, p));
        System.out.println(compare.compare(q, p));
    }
}
-1
0
1

比较

java的comparator java的comparator排序_ide