00:00
好,那这个呢就结束了,然后接着呢,我们来看一下第二种排序方式,这个对应的这个接口呢,叫做compor了。那已经有了一种排序方式了,为什么还要引入第二种排序方式呢?啊,有什么需求场景吗?哎,我们看一看,这里边儿我写了这样的两个。哎,看能不能看明白啊说呢,当元素的类型没有实现接口。但是呢,你又不方便修改代码的时候。那这个时候呢,我们看看有没有其他的方式,比如说咱们现在是用的一些第三方的一些类。他那只有这个点class文件,也没有这个原文件。你也没有办法去改人家的源码了。啊,什么意思啊,你就好比是咱们现在用的假设哈,咱们用的这个date吧,叫日期是吧。咱们呢也可以创建好多date的对象啊,第一呀第二啊第三呀,哎,我现在也是一个数组了,想让他们呢实现排序。假设呢,这个date呢,没有实现这个comp接口。你说现在呢,你想让他排序。
01:00
是吧,你说我把这这类给改了,你也改不了啊,这是JDK的核心的源码,你只能用是吧。你咋去改人家的这个源码,要都能改的话,那不安全性也太差了。只能用,你不能改。所以说这块呢,提到就是这样的场景是吧,我们又不方便改人家的代码了,那怎么办啊,还想排序。那这时候呢,就有这样一个需求了,这是一个哈,另外一个说呢,如果有个类,这个类呢,实现了comp接口。啊,也指定了两个大小的比较大小的一个规则了,但是呢,此时此刻呢,我不想按照它预定的这种方法去比较大小。但是我又不能随意的修改,因为你修改以后的话呢,原来的那种方式呢,就完全给破坏掉了。怎么办?比如说这个string是吧。String的话呢,它已经实现了接口了,默认呢就是从小到大叭较大小或者叫排序了,现在呢,我就想针对于呃,咱们这里边提供的这个顿。啊,咱们在这块呢,排序的时候呢,我就想让你从大到小来排。
02:01
怎么办?你说该死论?啊,假设string能改是吧,你改了string以后呢,你给它改成从大到小了,但是有些地方呢,还想从小到大。那就麻烦了是吧。怎么办?哎,这呢,就出现了我们的第二种方式叫做。啊叫。啊,其实它俩的区别,你看从名字上的话呢,其实也能够大概看出来哈,这个自然排序呢,大家可以理解成呢,叫自然而然的。就是本身在某一个类呢,如果实现这个compar。天然的就已经能够比较大小了。但是呢,有一些场景呢,不太适合用这个AR了,那我们就可以专门的定制一个。哎,就用这个。换一个场景,比如说大家这个本科毕业也好,或者研究生毕业也好啊,这个呢,你要找工作的时候呢,通常穿的要正式一点啊,你要买一套西装是吧,那么这个自然排序呢,就好比是你买现成的这个号的。啊,你是先穿那个叉L的呀,穿L的呀,还是穿M的呀。
03:01
这都是现成的是吧?啊,至于拿过来,你看哪个合适你就穿哪个了。但是如果你发现了这几个号呢,都不能满足你啊,这个你的体型呢,比较特别一些是吧,可能得需要呢,是不是得定制了呀。啊,这个定制呢,就专门针对你当前这个需求,我们的临时制定一种排序的方式,这就叫做定制。好,那我们来看看这个如何呢,去定制了。哎,新建一个是吧。这个我们叫做。诶,关于他的一个测试啊。好,这块我们来看看怎么去做这个事儿,嗯,这块我们去演示的话呢,String呢,诶跟咱们这个product呢,他俩呢,地位就拉平了。他们呢,谁想定制都得呢,一点点来啊,一点点去整啊,这个时候呢,我们说需要跟这个comp呢去打交道。啊,怎么去理解,咱们就直接拿着这个product来说了啊。的话呢,它天然给定了一种方式,那就是按照我们这个实现这个接口里边的这个方法的这个方式来,现在呢,我不想用你这种方式。
04:08
我就想临时的指定一种方式怎么办?啊,咱们呢,先把刚才的这个里边的这些对象呢,咱们先拿过来。And dress it。诶粘到咱们这个里边。好,站过来以后呢,现在呢,我们假设呢,还想来一个排序吧。哎,那就说白了,还是用这个瑞点这个so的方法了是吧,那这时候呢,你要把这个啊数组呢扔进去,相当于又是按照自然排序来了。诶,你会发现呢,在这个so的方法里边呢,我们加个逗号呢,它还有类似的这种其他的重载的方法可以传一个。是吧?哎,那就相当于我们是不是提供一个compare的这样一个接口的实现类的一个对象就可以了。好,那这个对象没有,那比如说咱们就先写到这吧。那提前呢,我是不是得把这个对象给创建出来。也就是说你要没有这个呢,我就按照你的自然排序来了。
05:03
也就是说你实现那个那个接口那个方式来了,那你要是传一个呢。我就按照你这个里边指定的这种排序方式来。好,没有没有,我们创建一个,咱们假设呢,就在这个位置创建吧。这呢就要创建一个啊实现了。Compar。哎,这个接口的实现类的。是不是一个对象呀。好了,那这呢,我就声明成了叫compar了。然后这个名呢,咱们就起这个名呗。然后右边这块呢,是不是就给他造个对象就行是吧,那这个对象造的话呢呢,咱们也不给他整一个。显示的一个类的名了,咱就直接匿名得了。前面咱不就讲过这个吗,你一个我写慢点啊。哎,Compare这么着写,然后这块呢,是不是得整个大括号是吧,哎,回车一下,然后呢,这块呢,里边有乘法方法嘛,我们al加个回车,哎一点。
06:02
啊,这出来好多是吧,这里边儿有一些方法呢,其实它不是一个抽象方法了,不用管它了哈,要点OK那一个就行。没问题是吧,那就可以了啊好,那么这个呢,咱们点进来看一下啊。这呢,是不是个抽样方法。没问题,再往下走哟。这是抽象的,你看。没有大框吗?这块的话呢,就是咱们刚才看到有一堆,它不是都有一些,你看default默认一些方法,下边其实都是了啊,就不看了,其实这里边出方法你发现有两个哈。那为什么我们这块呢,去让它自动实现的时候呢,他写了一个就不报错了呢。嗯。啊,对啊,同学反应的比较快一些。这个看能想到不?就是你看这里边呢,按说我们实验这个接口应该把这两个化,是不是都得去重写一下,然后你才能造对象是吧,但你发现这里边你写了一个就没事了,是因为呢,虽然我们这是一个匿名实类了,不管你实现你这类呢,是不是都直接会object了。
07:11
他这也没指定负类,那其实它的负类就是object object里边是不是已经有一个ES了。所以就看作对他的一个重写了。啊是这个道理啊,所以这块呢,我们没有重启呢,发现也并没有报错,用的就是object里边的那个E方法期待的啊。好,那么这里边儿呢,咱们确实啊,主要要重启的一个方法就是这个。这个名字。你这些对象呢,怎么算大,怎么算小,怎么比呢?是不是就在这个方法里边去指明了。也就咱们第一种方法呢,叫做实现comparable,咱们是在这个里边指怎么比,那现在的话呢,我们需要呢,是在这个方法里边指明。啊,我们在这写着啊,说如何判断两个对象,这两个对象是谁呢?一个是咱们这个参数的叫O1。
08:06
啊,一个叫O2是吧,如何判断两个对象的大小啊,其标准。啊,就是此方法的方法体要编写的这个逻辑了。啊,所以这里边呢,你到底你想怎么去排序,那这里边首先一个问题,他这写的是object啊。那在咱们这个问题当中,这个object应该是谁呢?就这哥俩呢,要比较大小了,咱们现在是不是product要比较大小了。哎,咱们也传到这儿了,其实呢,就相当于你把product这个对象啊,比如说A20把这个对象的引用呢,你就放到这儿了,然后把下边这个对象引用呢,就放到这儿。看看谁大谁小。拍一下,然后呢,接着呢,比如说我们再拿第三个再比是吧,所以这里边儿呢,其实我们要比较的就是这个产品,言外之意呢,我们上来就得先一付。一下是并。
09:08
啊,你俩呢,都得是商品,如果要不是的话呢,在这个位置是不是仍然呢去抛一个异常。Exception啊,是叫类型。不匹配。诶好这样个异常好了,然后在这里边你们都是这个商品了,咱们这块呢,写这个衣服呗。不是衣服了,直接强转吧。哎,这个叫P。哎,Product,然后把O1呢强转一下,O2呢也转一下。行,看这块儿行吧。旋转完以后的话呢,接下来那就看这个标准了,比如说咱们这里边儿。比如说是吧,按照。价格从低。哎,到高啊这个呢,我们做一个排序,这就比较简单了啊,咱就直接呢,就是p1.get一下它的这个price,这是一个价格。
10:00
呃,两个价格呢做比较,咱们还是得用一下那个double是吧。Compare,然后里边呢,传一个他。然后逗号一下,然后p2.1个price,诶把这个结果呢,咱们做一个return就可以了。还能理解吧?诶,咱们就不比较这个name了啊,咱就光比较这个价格好,那么这儿呢,就相当于我们给这一个标准,怎么算大怎么算小啊,就看价格啊,这个写完以后的话呢,我把这个comp呢,我传到这儿。哎,然后呢,你这时候呢,这个数组。就按照这里边儿这个标准呢去排序了。啊,注意虽然呢,咱们当前这个product呢,它实现这个接口了,但是现在没有按它来啊。而是按照我们给定的这种模式,因为你传了一个参数嘛。嗯,好,那下边咱们做一个便利呗。啊,在这呢,做遍历一下CTRLC回过来。哎,我在这个位置,哎,站过来。好把这个方法呢,我们做一个调用啊。
11:06
啊,大家看啊,这时候呢,我们说这个价格呢,就按照按照这个价格呢,从低到高来排序的啊,如果说你这块我想改一下啊,按照价格呢,从高到低。排序。哎,只需要呢,是不是这个位置变成个减号就行。再来。你看这不就降去了吗?哎,就这样一个思路。这呢,就完全按照我们自己这个标准来的。啊,这就可以了啊,那如果你说说我现在我不想用这个价格这种标准了,我想按照这个来排序。啊,这时候怎么做呢。我想按照内幕来排序,不想按照价格了。这个呢,假设咱们就不改它了啊。对,这个对象你就是按照价格排的,你不想用它了。就再重新造个就行。啊,那就说呢,你这个不合适,我定制了这个不靠谱儿啊,再重新的。
12:04
诶,我注释一下不要了,我呢再重新的再来一个是吧,或者说呢,上面这个我也不注释掉了,我也打开,只不过呢,你这个叫comp,我这叫COMP1是吧,我下边换成COMP1是不是就可以了。对,这个里边呢,我就指定了,我不想这样来了。啊,我想按照这个name。啊,所谓的叫从低到高。排序。啊,这个string的话呢,就是abcd这个顺序啊来排序了,那这呢,你就直接呢叫P一点get一个是吧,compareto2.get个。哎,就把它呢,作为这个结果呢,去返回一下是不是就可以了。哎,就这样写好这个写完以后呢,我们这块呢,传的是谁,你就用谁,我传的是你下边这个。那咱们就用下边这个走起。行,这时候咱们看这个名。啊,H是I vx是吧,哎,就按照这个顺序来的,那这个是O,这个是U啊U呢在下边。
13:06
那这呢,就我们按照这个内幕呢,顺序呢,进行一个排序的。诶,就这样实现的。行这块大家看能理解吧。这个叫定制呢,就是说你很灵活是吧,你想按照什么样的方式呢?那你就写一个实现了这个接口的实现类的对象,然后呢,你想比较的是哪。各类的对象的这个大小关系,那么这里边儿这个参数呢,这俩就是那个类型的。哎,那接着呢,你看想怎么算大怎么算小去写就行。啊,体会一下啊,那这个要清楚以后呢,呃,你看我们刚开始那块抛了一个需求嘛。什么需求呢?咱们针对这里边儿,上面不是提到了一个spring嘛,是吧。CTRL一下。哎,这呢,我粘过来啊,这个时候呢,这个string呢,咱们运行它这不是按照这个升序来排的吗。那如果现在我想按照这个降序来排,你说咋弄?
14:05
哎,你不能去改死了是吧。哎,那string本身你也改不了,人家都写好的这源码了,那只能是在这块逗号一下,是不是传一个or啊。这块呢,咱们是不是也可以整个匿名的呀。哎,我就拗一个。啊,这块他其实写的有点多了,咱们没有见过这个格式呢,是吧,我重来一下吧。哎,自己来啊,小括号大括号是不是这么着。然后这块alt加回车这么着。啊,就第一个就行啊,OK,一下就在这写呗。好,但而且的话呢,咱们现在呢,你想比较的是不是字符串是吧,所以这里边儿的O1和O2呢,都应该是字符串。所以就判断。啊,这个呢叫OE啊。是吧,并且O2。好在里边呢,强转。
15:00
后羿。复制一份。O2是吧,好,然后呢,我们比的话呢,就是S1,这本来就是个字符串呢,它呢叫compare to的时候呢,把S2呢给它扔进去,但是这时候呢,我们这就相当于还是这个从小到大来的。Return的时候是不是整个符号。对的啊,然后这块呢,他可能会说,万一要衣服没进去,你还没有返回值呢,给咱跟前面一样,别让他抛个异常。哎,这不就可以了吗?行,那这块咱们就提供了一个具体的compare了,这里边儿呢,指明的就是降序来的,所以呢,我们这时候呢,调了一个so方法,哎,咱们得到的这个数组呢,就是降序排列的。这不倒着来的嘛。哎,这就可以了。好,这个呢,就是咱们讲的这第二种方式啊。啊,一个呢叫自然排序,一个呢叫定制排序,来我们看这块儿啊,这个呢是实现叫compar这个接口的这个方式。
16:00
啊,这个实验步骤我们看看啊,首先第一步。啊,第一步怎么说呢。哎,创建一个实现了。接口的。啊,实线类是吧,然后呢,这是咱算第一步吧,然后呢,此时线类哎,胡叫。这样说吧,创建此实现类的这个对象。啊,然后这个。把那个重写方法写到这儿吧。创建一个实现了compare接口的这个实现类。然后呢,并。在这写个二吧。啊,实现类要求。重写。啊,这个comp接口中的方法。哎,这个抽样方法,你注意咱们是叫compare方法啊,跟上面的有点像,但是不一样。这个呢,两个参数。
17:01
哎,重写这个方法。啊,然后呢,在此方法中是吧,指明。指明什么呀?这个类呢,假如要A哈。是指注意看这啊。然后我这样说对不对,这个呢,实验类呢叫A,然后这个实验类A呢,我们说要求重写的方法,说在此方法中指明。实现了A的多个对象如何比较大小,对吗?啊。再说一遍啊,我们现在呢,在这里边要。这个方法了,那问这里边这个object。对,注意不是哈,不是,你看咱们刚才写的时候呢,哎,我放到这边了,咱们把这个收起来啊,我们这时候呢,这个类呢,我根本都没有起名嘛,是吧。只不过在这儿呢,我起了一个,说这个名呢,叫雷了。这个呢,其实就我们这个实现类,其实你也没有必要非得给他起个名,匿名呢也行。
18:03
然后呢,具体说你这个object是谁,其实呢,关键就看你要比较的是哪一个类的对象的大小了,是吧,那就是谁在咱们这个问题当中,那这个就是。啊,然后在这个问题当中,那就是product product。啊,所以这块你得看清楚,并不是说这个product,或者呢,是我们这个compare实现类,这可不是啊。哎,所以这样啊说在此方法中指明,哎要。哎,这个比较大小的对象是吧,那就这样说吧,大小关系。啊,这样来说哈,然后这里边儿这个多个对象呢,就是我们,嗯,到底是哪个类呢。啊,它的这个对象要比较的,比如这个product在我们这里边儿就是它。啊,指明要比较大小的,对象的大小关系有点绕,是在我们这里边呢,就比如说咱们是这个string类。或者是咱们这叫这个类。哎,这样。
19:01
哎,说清楚啊,然后第三步的话呢。来第三步,创建词。啊,实现类的对象,这个实现类呢,是A的这个对象,然后呢,并将此对象。啊,在我们这个里边呢,咱们相当于是呃,用的是这个a risk.sot方法,哎,传递到相关的方法的参数位置是吧,然后呢,你相应的你还要传你上面这个比较对象的这个这个类呢,它的几个对象。就是相当于呢,就是这里边儿呢,是我们要比较。大小的这个对象了,这个对象呢,可能有多个,像我们多个呀,多个string是吧,然后呢,按照你这个A的对象里边的这个compare方法呢。去比较。有点绕是吧,这个哎,声明在或者要传入到是吧。哎,相关方法的。哎,参数位置。啊,即可啊。
20:01
哎,在我们这里边呢,比如说咱们这个aris,它的有一个叫so的方法,在这里边的话呢,我们需要呢,就传入这个类A的这个实例是吧。那就他啊。啊,这样情况,然后呢,你前面这个点点呢,就是你真正要比较对象的,比如说你是啊还是它的多个实例了吗。哎,放到这个位置就可以了。行,这呢是咱们说的这叫诶第二种这个方式。稍微捋一下了啊,那最后呢,咱们把它做个对比啊,这个咱们就告一段落了啊,这两种方式的话呢,诶大家看看能不能体会它们的一个区别。是吧,能不能体会一个区别啊,啊,你比如说咱们还回到最初啊,一开始讲这个比较细的时候,是吧,我说呀,在整个这个那页面当中。啊,可以理解为既体现了叫自然排序,也有体现定制排序的地方。
21:03
看看怎么理解。呃,假设呢,我们这块呢,它呢,就是这个叫一个对象了,这呢就有四个对象是吧。这四个对象怎么去体现它是自然排序还是定制排序呢?这个场景呢?啊,你看啊,我们一搜这个鼠标的时候呢,它自然的是不是就有一种排列方式是吧。这种呢,其实咱们就可以理解成是。叫自然排序。就自然而然的它就有一种排序方式了,你可以理解成呢,就让当前这个对象呢,所属的类呢,去实现这个comparable对吧。没问题是吧,好,那么除了这个自然排序之外呢,我呢,是不是还会有一些个性化的需求啊。我想按照销量排了,我想按照评论数新品价格啊,价格呢,还分成从高到低和从低到高来排序的。那么这时候呢,后边这四个。实际上呢,都相当于四个是不是定制啊。
22:01
啊,你想怎么排,你在专门的去指定一下,这时候你不可能说我把这个类里边这comp去改一下,这标准不能来回改了,它已经有一种自然而然的一种方式啊,你可以理解成就这个综合了。你在个性化的呢,就诶创建各自的实现。啊,这个接口的实现类的对象就行了。这就是他们各自的场景是吧?对吧。对,这个你传的肯定是这个实现类的对象吧。OK啊行,那回过来这块,你看我们怎么去对比可以呢,从不同的这个角度来说啊,比如说呢,你看我这写一个叫诶角度一。哎,角度一这块呢,比如我们说这个叫自然排序。啊,这自然排序,然后定制排序,这个呢,我说这个自然排序呢,它这个排序方式呢,是单一的。啊,或者叫呢,它是唯一的。对吧。哎,他呢,比如说按照价格排,那就已经定死了,不能动了,而从这个角度来讲呢,我们这个定制排序呢。
23:05
是不是灵活的多样的呀?哎,你想换一种方式,那你就再去重新的提供一个这个实现类的一个对象就行,然后呢,实现类的时候,你当时把这个方法是不是再个性化的重写一下就可以了。哎,这是我们这个角度一啊,好角度二。我们再来看一下,这叫哎,自然。来排序啊,这个角度是什么角度呢?就是大家你看一看,如果我们想让啊一个类的多个对象去排序了。啊,你要选择自然排序呢,你会发现呢,只要你让当前这个类呢,实现这个接口了。是不是以后?总是可以让它比较大小的是吧。就是一旦呢,实现这个compare的接口了,那你其实呢,相当于理解成叫一劳永逸的了。啊。啊,一劳永逸的就是总归呢有一种方式比较大小。
24:00
而你要用定制的呢?你每次是不是都得临时的去写一个呀?你比如说像string是吧,String的话呢,它实现了这个comparable了,相当于就是自然排序了,那不管在什么地方,只要呢,你有多个string的对象,相比较大小,总归有一种方式吧。啊,因为已经实现接口了是吧,但如果string要没有实现这个接口,那你每次要比较大小,是不是都得临时的去指定一下是吧。哎,就是这样一个角度啊。这个呢,其实基本上也就把这个事儿呢,就说的比较清楚了啊,然后这个所谓的这个角度三呢,其实就看一下这个具体的细节了啊,咱们对于这个自然排序来讲。啊,很多同学在这块,哎,后边去写的时候呢,因为呢,这两个接口长得很像哈。然后呢,里边这个重写的方法呢,也很像,别整混了,这个自然排序呢,咱们需要呢啊对应的接口。是。Compar是吧,然后呢,对应的这个抽象方法呢。
25:03
叫compare to。啊,一个参数。啊,然后呢,下边这个呢。这个呢是吧。这个呢叫compare方法。对,这是一个。还有一个。其实为什么这块个数不一样呢,其实也很好说啊,你看咱们呢,是不是让你。哎,你是想两个对象呢,假设比较大小了,实际上这两个对象所属的类实现这个接口的。那所以说我们比较的话呢,肯定你是得有俩俩对象是吧,诶那么因为你是让这个类实验这个接口呢,那自然而然的调这个方法的,是不是就有一个对象了。所以这个对象呢,To to不就是跟谁嘛,哎,跟这这一个,所以呢,这个就相当于第一个,这就是第二个,所以调了一个方法呢,就已经是一个对象了。哎,所以这块呢,就只有一个参数啊,而这个为什么有俩参数呢。
26:03
对,你这个compare,咱们上面写的它的这个实现类。实现类里边呢,写的这个方法,其实这个实现类的对象调的这个方法啊,那你这个实现类的这个对象跟我们这要比较大小的对象是不是两回事。对啊,比如我们在刚才写的这个问题当中。咱们写这问题当中,这里呢,咱们对应的这个对象呢,叫一。而我们这个O1和O2呢,是商品是吧。所以你调这个方法,这个对象呢,跟我们这个要比较对象的这个根本没有关系哈,所以呢,你这里边儿呢,要比较的是谁,你得通过这个参数去说,那一定得是俩了嘛。不像上面这个,人家调离方法就是一个对象,所以跟你这一个比,你这个呢,对象调离方法的那个对象跟我这儿没关系,所以我就得传俩是我这俩比较大小的。哎,所以它得有俩。哎,细节呢,大家去体会一下啊,这呢就是他们的区别,那么以后呢,咱们在开发当中,其实呢,不就是用这个或者是用这个吗。
27:07
啊,那对于我们这个具体来讲,大来说,你可以呢去实现。啊,你要是平时用的话呢,先给你一种方式,但你说我这时候我不想用这种方式,那你就是不是可以定制的再整一个是吧。就行了。好,那关于这个排序呢,咱们就说到这儿啊。
我来说两句