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 是最小的@Overridepublic 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