- 不同的比较器就类似函数指针,传递给我们的sort方法。sort方法依据传进来的比较器进行依据不同键值的排序
- 我们通过Comparator接口在数据类型内部实现多比较器
- 然后利用这么多的比较器去调用同一个sort,但是sort依据的排序键值就变了。于是变达到我们的目的:对任意数据类型按照任意键值进行排序,但仅仅使用一种sort代码实现 【这里我们以插入排序为例,实现接受比较器的插入偏序算法】
- 优点分析:Comparator接口再一次提高代码的抽象层次。原先我们使用Comparable接口仅仅能够做到将比较部分的代码从排序算法中抽离出来而在数据类型中实现。现在,比较代码的实现甚至脱离出了数据类型(在我们的例子中,Transaction)。总之,用Comparator接口来代替Comparable接口能够更好地将数据类型的定义和两个该类型的对象应该如何比较的定义区分开来。
在任意数据类型内实现Comparator接口(上述第二步)
//在任意数据类型内实现comparator接口,并定义不同的比较器
//下面以交易数据类型Transaction为例
import java.util.Comparator //必须有这行
public class Transaction
{
//def of 键值
...
private final String who
private final Date when
private final double amount
...
//实现Comparator接口和比较器
//只要一个数据类型实现了compare方法(而不是compareTo),那么他就满足了Comparator接口
public static class WhoOrder implements Comparator<Transaction>
{
public int compare(Transaction v,Transaction w)
{ return v.who.compareTo(w.who)} // compareTo在Date数据类型里已经实现
}
//同理可以定义以下两个比较器WhenOrder HowMuchOrder
public static class WhenOrder implements Comparator<Transaction>
public static class HowMuchOrder implements Comparator<Transaction>
}
下面是使用了Comparator的插入排序,使得我们对多键数组按照我们任意我们在乎的键值属性进行排序
//接受比较器参数的插入排序实现
public static void sort(Object[] a,Comparator c)
{
int N = a.length
for(1)
for(2)
exch(a,j,j-1)
}
private static boolean less(Comparator c,..v,..w)
{ return c.compare(v,w)<0}
...省略 exch代码实现
用例代码示例
Insertion.sort(a, new Transaction.WhenOrder())
Insertion.sort(a,new T.HowMuchOrder())