用接口模拟实现排序方法

前言:

通过对Comparable,Comparator的理解,我们可以试着完成一下对sort的模拟实现,理解sort内部的构造,加深代码的理解,以及加强接口的理解,从而能够写出优质代码。

我们知道,一般比较大小取决于类型,比如int类和int类比,double类和double类比,但是,对于String类还有我们自定义类,能进行比较嘛?如何去比?下面就来写写看。

先定义一个学生类:

如果int能和int进行比较,那么student类能和student类进行比较嘛?

答案是不能直接比较的,因为编译器不确定是通过什么方法比较,比如让sort方法进行排序,编译器会报错

那我们该如何使其能成功比较并且排序呢?

接口——Comparable:

想要成功比较,就需要我们的Comparable接口,并且实现compareTo方法

我们看看Comparable内部:

 

<T>中的T是涉及泛型的内容,可以将T看成是Object,指定类型,可以指定为学生类,相当于利用compareTo方法进行学生类的比较。

里面有个compareTO方法,形参实际是Object,重载着许多比较的实现方法,

例如String类的比较方法

可以看到,是用首字母进行比较的,接下来就在我们的学生类里面实现一个接口的方法:

重写compaTo方法:

name为String类,相当于再次引用了Object类的compareTo方法,形参为String

age为int类,该类直接依靠返回值来比较即可

通过名字比较,得到:

这样我们就知道了如何比较自定义类型,下来我们继续看看如何模拟实现sort

sort方法内部:

其他的内部实现很复杂,我们只看形参,可以为任何类型,且传入的类型都是可比较的,这个归结于compareTo方法(在sort方法中会自动调用compareTo方法,compareTo方法的参数是Object)

既然参数列表为Object[],我们就可以直接定义一个Comparable接口数组形参类型,用来执行排序功能

但是还有个问题,在compTo内部的方法已经写死了,用了名字就不能再用年龄了,这时候该如何解决呢?答案是换接口

接口——Comparator:

Comparator内部:

它有个compare方法,用来进行俩个类型的比较

我们可以采用俩个接口的方式,一个接口使用年龄排序,另外一个接口采用名字排序

年龄排序:

名字排序:

比较方法的使用:

sort的第二个参数:

我们知道sort方法重载了很多方法,其中包括这个,第二个参数可以选定比较方法,来实现多样化的比较方式,不用局限于固定的方式

希望各位多多指教

                                            

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值