00:00
行,那么自然排序呢,咱们就讲完了,自然排序完了以后呢,我们还涉及到第二种排序方式啊,这呢提到叫定制排序,这个定制排序呢,就涉及到我们说的另外一个接口,这个接口呢叫comparor啊compor就是本质上来讲,Comparable也好,Compor也好,它的核心的这块呢,都是comp啊都是这个呃叫词根了啊,诶compare呢就是比较的意思了,所以都会涉及到这个比较大小的这样的这个操作了,这呢是另外一个接口,这个呢叫定制排序啊,第一个呢叫自然排序,自然排序呢,你就可以想象成叫自然而然的一种排序方式,像咱们这个用这个string的时候,咱们呢,只只管往里边去扔啊,扔进去以后呢,它就自然而然的就给我们排好序了啊这个呢,我们就是让呃,你排序的这个数据,它这个类本身去实现这个compareable接口。呃,像这种方式呢,咱们称作叫自然排序,那么这个叫定制排序,呃定制这个词呢,其实咱们也见过啊,呃,像大家呢,你可以去定制一个蛋糕是吧,或者呢,你还可以定制一套衣服啊,结婚的时候呢,这个呃一人一辈子就一次啊,通常一人一辈子就一次是吧?啊这个呢,就是正式一点,然后呢,定制一套西装啊,这叫定制,就是根据你实际的需求啊,我喜欢什么样的这个蛋糕啊,我身材什么样子啊去定制一下,那么这个排序呢,就要定制排序,就相当于呢,你可以按照你的这个需求呢去指定,比如说,比如说呢,咱们这个润string的话呢,它已经实现了这个comp接口了,我们呢只管往里边去放,它呢就从小到大排了。
01:41
比如说现在呢,我们不希望让它从小到大牌,我们希望让它从大到小牌,这就相当于我们给他定制了啊,这是一个,另外呢,就是像咱们这个叫goods,咱们自己写的这个商品类,我们呢,去实现compare了,在这里呢,咱们是先按照价格呢,从低到高,然后按照这个产品名称呢,从高往低,这呢相当于也给它定义好了,要排呢,这样排,那如果说呢,我们又不希望呢,按照这种方式去排啊,在具体的问题当中,具体的问题当中呢,我们又想指定一种新的排序方式,这个时候呢,我们就需要跟这个接口来打交道,叫compet。
02:18
啊,其实呢,没有想的那么复杂了啊,这个咱们一写代码呢,其实大家就清楚了啊,这儿呢,首先关于它的使用的一种场景,他回到咱们这块呢,往下边我这块去写,嗯,这呢是跟上面的一个对应一下,嗯,它的一个使用举例,这呢相当于叫自然排序啊这个。嗯,很嗯per啊,这个接口的一个使用啊,这个呢叫做定制排序啊,首先呢,关于它的出现的一个背景,就是本身呢,已经有了comparable接口了,干嘛还引入一个叫comparor这块呢,提到了一些这个说明,其实呢,就涉及到刚才我们这样的一些说法。
03:01
看一下说呢,当元素的类型啊,没有实现comparable接口。啊,而又不方便的去修改代码,比如说呢,像咱们这个JDK当中的一些类,人家那个类的话呢,没有实现这个接口,但是呢,咱们又不可能去改人家JDK这个代码了,那这时候你可以用这个定制啊,或者的话呢,说实现了这个compar接口了,但是这个comp接口这种排序方式呢,又不太适合我当前这个操作。就像呢我们string,我呢就想按照我现在指定的一种从大到小去排,就像我们这个故事啊,我呢就想按照这个姓名先排,然后再按照价格排等等,就有一些新的这个方式了,这个时候呢,我们就可以再去定制的去指定一种排序方式啊,对应的就叫做competitor啊,它来做的这呢也是个接口,那这既然是个接口呢,接口当中呢,就会涉及到这个,呃,抽象的方法啊,我们把它呢先CTRLC一下。
04:00
Ctrl shift t ctrl啊这个直接就呈现出来了,双击进来,这是一个接口,那接口当中呢,它就会有这个抽象的方法指明呢,你到底想怎么排,这里边呢,就提到一个叫compare方法。啊compare方法这里边儿的这个T,包括呢,我们看这个接口这块呢,也有这个T,这呢其实是泛型啊,咱们呢暂时呢先忽略掉这个泛型,咱们讲完集合以后呢,再说这个泛型啊,这个你就当没看到就行了,好那回过来以后呢,我们怎么去做呢。那首先呢,我们把这个事儿呢,先明确一下啊,就是如果你要考虑用这个接口的话呢,就需要去重写这个刚才看到的叫compare方法,那这个compare方法呢,怎么重写,这规则是什么,实际上跟咱们那会儿提到的compare to呢,是有相似之处的。啊,这个CTRLV我们直接的就拿过来啊,你要说这两个有什么区别呢,也有区别,就是我们这个方法呢,它是有两个参数。上面这个compare to这个方法呢,咱们是拿掉这个方法的对象和行参去比大小,而我们这个呢,不是这个呢,就是让行参这两个对象呢去比较大小。
05:09
那如果说呢,你返回是正数,通常呢,我们就是前面这个呢,就比较大了,返回零相等,返回负数,就是前面这个呢,比后边这个小啊,就是大小这块呢,跟上边这个规则是一样子的,行,那咱们来看一下这个怎么去用呢?嗯,这个我们写一个单元测试方法。是啊二啊,这个就写成了三了成,那比如说呢,咱们现在还是想调这个叫A瑞,哎,我去调这个叫ST方法啊,那ST方法进行一个排序,排序呢,比如咱们还是先拿这个string来举例子。String举例子,咱们那会儿呢,调的相当于是这个结构了啊,就是相当于按照它默认的这种自然排序去排的从小到大啊,那我们现在呢,不想让它从小到大了,我们会看到它有一个这样的结构啊,有一个这样的结构,这个里边这个T的话呢,因为这又涉及到泛型了啊,这个大家呢,可以先忽略掉啊,忽略掉呢,或者说呢,其实相当于我们把这T呢就看成是object了,那前面呢,其实就是object。
06:13
那这个时候呢,我们调这个方法,那咱们把这个string呢,给它放进去,那string呢,咱们比如说还是用上边儿这个string啊,CTRLC。还是用它,我把那AR呢扔进去,你要这样写呢,还是从小到大,咱们不想用这个,后边呢,咱们可以传一个参数。啊,可以传一个叫compar,这是个接口,我们呢需要去创建一个接口实现类的对象,这个实验类的对象呢,我们也就用这一次,这个实验类呢也就用一次。对,干脆就匿名得了,那匿名的话呢,看看啊又一个comp吧,这样是吧,哎这么着一下,然后呢,我这整个大括号呗,回车一下这个位置呢,我们out enter一下,是不是就实现这个方法呀,哎,主要就是它对吧,然后OK一下。
07:07
啊,这就行了啊,你可能会看到说这个a comparor啊,Ctrl o一下你会看到,诶这里边这么多方法呢,你看是吧,但这个方法呢,你看都是静态方法,咱们说接口呢,在1.8的时候呢,是不是也用这个静态方法了,哎,这个静态方法都有方法体,所以这块呢,咱们其实这些静态方法你就用不着重启啊。是吧,你也重写不了静态方法,咱们说也不能重写啊,那关于这个抽象的方法的话呢,我们这边就重写这一个啊,这一个呢,就叫做compare,哎,这个方法就可以了。哎,就重写这个方法就行啊成这是我们说的这个事儿,那么回过来,回过来的话呢,我们在这个里边。需要指明说两个对象叫O1和O2,怎么排啊,因为咱们这时候呢,没有讲泛型啊,讲到泛型的时候呢,咱们到时候再把这个事儿呢,稍微带着大家再回顾一下啊,这个我们没有讲泛型,这呢都用的是object类型的,那现在呢,咱们是把这个字符串。
08:11
好好多个字符串进行排序,那很显然这里边O1O2呢是都应该是字符串啊,你要不是字符串的话呢,那这块你你把它放进去就不合适了啊,所以说呢,在这里边我们去判断说要求呢,这个OE呢,你得ince of这个string。同时啊,并且OR2呢,也得in of这个string。哎,都得是字符串,在都是字符串的情况下呢,首先我们把它俩做一个强转。String先应该叫S1,这个呢是O1O1啊,Alt enter强转一下,然后类似的S2。对。啊,来一个O2好,这呢都做了强转了,强转完以后,我们这两个对象呢,我就能看到都是string了,然后string的话呢,咱们现在比如说想按照它从大到小的顺序去排。
09:09
你不是默认从小到大嘛啊,我现在从小到小,实际上我们就直接再调一下S1写二,哎,我调一下它的compare two这些S2,但你这样呢,又成了从小到大了,我们加一个符号就可以了。哎,这样就成啊,那这个位置呢,Return是个零啊,你RETURN0呢,你也可以给它改掉,哎仍然呢是抛一个异常,哎runtime的exception说呢,诶输入的这个数据啊,类型不一致,后边呢,咱们讲了这个泛型以后呢,实际上呢,我们在这个位置呢,就保证它就是死钝了,就是这呢就可以写成死钝了,现在呢没讲泛型,暂时呢先这样写。好,写完了这个我就写完了,相当于在这个位置呢,咱们就指定了一个叫定制排序的一个规则,就是按照我们字符串从大到小。
10:02
按照字符串啊,从到。哎,到小的顺序排列。成,那写完以后,那排序都排好了,那接着这个事儿呢,就是做一个简单的C了。Concy。啊,就行了。来,我们跑一下。哎,大家看,那这时候呢,这不就从大到小的顺序排了。哎,这个呢就是这样啊,其实呢,不是特别难啊,就是这时候呢,我们其实对string呢,本身没有影响啊,String呢,人家去实现comparable了,这个你回头呢,还是可以这样用啊,还是可以这样用的,就是默认呢,它还是从小到大啊,突然呢,有一个场景我们需要呢,让它从大到小了,那你这时候呢,就临时用一下这个,呃,Comp就可以,那指定一下,按照我们这个规则来进行排序就行成这呢我举的是这个string,那同样的道理,咱们还可以自定义吗?对于咱们自定类其实一样。
11:03
哎,Test的一个四。哎,行,那这里边的话呢,咱们还拿上边咱们这个商品为例啊,还把整个这个代码我CTRLC过来。放到这儿,那这个时候呢,我们扫的时候呢,没有指定第二个参数,那此时呢,相当于它还是按照这个自然排序进行实施的,那那咱现在呢,不是说要定制的吗?定制呢,我们逗号一下得用它另外的一个方法啊,传一个comparor。那我们这里边就去捏一个啊compar哎这样子你看这呢,显然用泛型了,用泛型的效果呢,就是这块呢,我就能看到它就是商品。那现在咱们没有讲泛型,那我就先把它干掉,那干掉呢这块呢,这提示这样就不对了,因为这个呃,行参呢就不合适了啊我们alt enter重新呢,去让它生成一下。哎,这不又是我们这个,诶compare,哎,Object类型,那这里边你就可以具体去指定了,现在咱们用的是这个商品,那我们就换一种方式了啊,虽然你这个故S这里边呢,指明了是按照这种方式排的,现在呢,我就不想按照你这种方式了啊CTRLC我们改一改。
12:16
改成呢,咱们先按照这个产品的名称从高到从低到高吧,产品名称。哎,然后呢,这个价格。这么这么着啊,先按照产品名称从低到高,然后再按照价格呢,从高到低。就相当于咱们只要换一种方式就行啊,还是进来首先我们先判断,如果这个OE instance of先是一个商品。同时O2它也得ince of这个商品,哎,都是商品了,先强转这个叫啊之一吧。
13:00
OE再复制一份。行,得到两个商品了,接下来那就得判断了,首先呢,按照这个产品的名称从低到高排列。从低到高排列,这个呢,其实我们直接去调这个内就行是吧,嗯,那我们就先怎么着啊。内图它俩内如果要是相同,嗯,其实呢,正常情况下呢,先这么着吧,这1.get一下内先看下是不是这个equals。啊,Equals,这个G2.getname,这就相当于他俩名字一样,名一样的话呢,我们再按照这个价格排啊,名要是不一样,我们就这直接return了啊,这一点get一个name,第二直接还是调这个compare to。选g2.name这个从低到高,那么默认呢,就是从低到高了啊,那如果你俩名字一样,名字一样呢,我们再比较它这个价格,价格呢,咱们这块这不是要么你就写好几个衣服,LC衣服,像咱们原来这个类里边这样的写法一样啊。
14:04
要么你就这样写,要么呢,咱们不是说还可以这样吗。哎,我这呢,CTRLC一下。哎,这样。嗯,这里边儿呢,是咱们这个G1的,这个就不能这么着了。G一点get一个price啊,G2点get一个price这样啊,但这个时候呢,你要注意就是我们这个compare里边呢,它这个这个小于它呢,返回的是负一,相当于这个compare方法呢,还是一个从低到高的顺序排的啊,这个咱们现在呢,不是你想让从高往低嘛。是不是这个位置补一个符号啊。啊,就成了,就让原来正的变成负的,负的变正的,这不就正好,哎,顺序就反过来了吗。哎,咱们原来呢,这个小的减去一个大的,这不变成负数是吧,负数呢,就相当于是它小就让它放前边了,你现在呢,在这个括起来以后,变个负号就变成正义了,正义呢,就认为你前面这个大了,你不就往后放了吗?这个就往前放了,哎,就这个道理。
15:07
行,这样的话呢,咱们就把这个呢,就写完了,就啊写完呢,这块我们这是一个衣服,那有可能呢,不是衣服就蹦到这儿了,那同样的我们去抛一个异常可以。CTRLC。哎,在这个位置。行,这就搞定了,那接下来呢,我们排好序以后,对它进行一个吐丝针。先按照产品好,我们执行。哎,大家看啊,这个D是吧,然后呢,这个H开头的,然后这个L开头的,嗯嗯嗯,M开头,这个咱们好像名称没有一样的,哎,小米咱们整一个名一样的。比如说我们这个再来一个六啊,嗯,这呢再多一个。这来一个叫四,这个叫五,嗯,华为华为呢,还有一个鼠标呢,比如说比较贵,224。
16:04
嗯,这个呢,咱们是上价格从高到低,那就他应该是这条数据,应该在这条数据的前面了。好,这个呢先DH,那H这个是H,那这个价格高的就在前面了,行就这样来做。好,那么关于这两种排序方式呢,我们就讲完了。嗯,这两种排序方式呢,其实还是比较重要的啊,就是大家呢,后边总结一下啊,就是只要呢,我们在成语当中涉及到对象去比较大小了。那就会跟这两个接口呢打交道,这个呢叫自然排序,这个叫定制排序,用哪一种都可以啊,那你非要说一下这两种方式有什么区别。这种呢,就是你要是让这个类啊,这个这个相当于咱们这个简单说一下啊,这个它的一个使用,这是三啊,或者这个下边都有啊,这个我写成它吧,这个接口与咱们这个叫compare的这个接口的一个简单对比啊。
17:16
对比啊,对比的话呢,就是总结一下,就是我们呢,要让两个对象呢去比较大小,这个呢方式相当于咱们是让这个对象呢,所属的类去实现那个接口啊这种呢。是咱们调这个方法的时候呢,临时啊,相当于是给了一种排序的方式,它属于临时性的。啊,你要让这个数据进行排序这种呢,其实有点像这个,呃,一劳永逸似的这种。就让这个string我们呢,呃,指定怎么去排,以后呢,呃,就是你让他去让这个string类去实现这个接口,那么以后呢,凡是排序这个string都可以排。但是如果呢,我们定义了一个类,像这个故这个类啊,这个类呢,如果咱们没有去实现这个compable接口。
18:05
啊,而是呢,你呃,使用咱们刚才说的这个叫comp接口,那其实呢,你只是在咱们当次就在这块呢,临时用了一下。以后呢,再排的时候呢,是不是你要么还得再去拗一下,对,相当于没有指定一个长期可以用的这样一种方式了啊,这就算是他俩的一个小的区别吧,啊就是这个啊它啊这个compare这个接口的方式。呃,方式呢,就是一旦指定啊,一旦指定啊,能够保证啊,这个这个compable接口实现类。啊在啊,任何位置哎都可以比较大小,哎,这个视线类的对象,哎在任何位置啊,都可以比较大小啊,而我们这个compare的这个接口的方式呢,它相当于是一种临时性的比较。
19:06
啊,临时性的比较啊,什么时候需要呢?指定一下,你就临时的去创建一个compare的一个实现类,呃,然后呢,去比一下就可以了啊行,这是算它二者的一个不同啊,就像你买这个筷子一样正常,相当于是你买了一个呃,可以反复使用的一个筷子,这个呢,属于一次性的筷子啊,就这个区别好,这个呢就结束了。
我来说两句