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