通过JAVA比较器实现对多键数组的多种类型排序

  1. 不同的比较器就类似函数指针,传递给我们的sort方法。sort方法依据传进来的比较器进行依据不同键值的排序
  2. 我们通过Comparator接口在数据类型内部实现多比较器
  3. 然后利用这么多的比较器去调用同一个sort,但是sort依据的排序键值就变了。于是变达到我们的目的:对任意数据类型按照任意键值进行排序,但仅仅使用一种sort代码实现 【这里我们以插入排序为例,实现接受比较器的插入偏序算法】
  4. 优点分析: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())

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值