00:00
那么接着的话呢,咱们来看下一个内容。肠类和基础API啊,这个呢叫Java比较器,实际上呢,就涉及到两个接口的使用。嗯,还是比较重要的。凡是呢,咱们涉及到这个对象比较大小了,比较排序需要排序了,这时候呢,我们都得需要跟这个比较器呢打交道。啊,这里边刚才写的啊,说基本数据类型当中,除了波尔之外呢,如果比较大小,直接呢,我们用这个运算弧就可以了啊,大于啊小于啊就没问题了,当然这个引用数据类型呢,它天然是不能够比较大小的。因为它存的是一个地址,你说地址谁大谁小,这个数不靠谱啊,那我们该如何去解决这个大小比较的问题呢?呃,首先呢,先涉及到问题,我们为什么对于引用数据类型,尤其呢,就是对象了,还需要去比较大小呢。啊,这你看我列的这个例子就是是吧,比如这里边儿每一个篮框,这是我用这个鼠标的例子来表示的,然后每一个篮框的话呢,其实都是一个对象了。那呈现给用户的话呢,我们把这个属性呢,就显示出来啊,在对应的这个标签的位置就可以了,那么这些对象的话呢,你会发现呢,是可以比较大小的。
01:09
或者说呢,是需要排序的,排序的前提呢,你得是比较大小。比如这里边你会看到了有一个默认的排序,然后你也可以按照销量排、评论数排、新品排、价格排,还可以升,还可以降。啊这样的一个情况,所以说这块呢,我们有必要呢,对对象进行排序,也就是呢,有必要对对象呢,进行大小的一个比较,那么该如何去比呢,这块就需要呢,跟我们提到的一个比较器呢,来打交道了。OK啊,其实大家也能够大体上猜到了,我们比较对象的大小,实际上呢,就拿这个对象的一些属性是不是去比了。而这个属性的话呢,实际上就会涉及到是基本数据类型里边,除了布尔之外的那些类型啊,比如说你这个价格呢,是大部型的,那价格高的,我就认为你这个对象大。价格低的,我就认为这个对象小了啊,类似这样的思路。OK,行,那咱们就直接回归到这个代码层面啊,看一看这个比较器该如何去使用,然后呢,这块呢,涉及到两个比较器,一个呢叫comparable,一个呢叫compar啊以他俩名字啊来说的话呢,我们这两种方式呢,一种呢就叫做自然排序。
02:18
啊,另外呢,这个自然排序呢,对应的是这个comparable啊,另外这个呢,叫compar称为呢叫定制排序。那我们讲完之后呢,你就知道为什么叫自然排序,为什么叫定制排序了,好,那首先的话呢,咱们针对于这个叫comparable呢,咱们来讲解一下。OK啊行,那这里边儿呢,首先我们先创建一个测试的啊,比如我们就叫comparable它的一个测试。啊,过来过来之后呢,咱们先针对于比较常见的,比如说字符串吧,咱们先去体会一下,因为字符串呢,毕竟也是对象嘛,看他这块的一个排序的一个情况。哎,先来第一个啊。啊,这块我们这样来举例,我呢,首先啊,创建此针类型的一个数组。
03:03
OK,在这里边儿呢,由我们指定五个吧。哎,五个字串啊。然后呢,我们就分别呢,先给他做一些赋值,那赋值的话呢,我就不这样写了,咱就直接呢在这块后边写得了。在这写是吧。来一个这个。写几个名吧,比如说。Tom Jerry。啊,托尼。啊,肉丝啊。杰克。啊,再来一个。啊,Lucy啊。我们上这个中学的时候呢,这个英文课文里边呢,有个双胞胎,一个叫Lucy,一个叫Lily。你们还是吗?还有李雷、韩梅梅。是吧,这就是里边这个人物啊。对,后来好像还有李雷韩妹妹那个电影是吧,俩人还谈恋爱了哈。嗯。好,这个呢,我就写进去了啊,写进去以后呢,下边呢,咱们针对于这个死缀型的是不是有多个对象了,咱们做一个排序啊,针对它排序的话呢,咱不是有一个叫A瑞吗。
04:06
有个so的方法是吧,这呢,我们就把这个AR呢给它扔进去了。哎,扔进去以后呢,我说呢,他就能够排好序了。那这块我们就上面这个我就不去遍历了啊,咱们排序完以后。便利,哎,我就写个方循环了。这就ar2.ls一下,然后这块我们就直接打印这个AR角标A啊看一下呢,是不是给我们排好了。哎,你看一下啊,是不是Jack Jerry Lucy Rose Tony是是吧。这个呢,默认呢,就是从小到大的这个顺序来给我们排的,注意这块大家在写这个名的时候呢,你不要写汉字了,就。咱们不是也提了一下那个汉字呢,可能不是大家想象的那个章呢,就在这个里的后边,结果你发现这个理呢,好像这个数更小一点是吧?嗯,这个呢,就不要拿汉字了,咱们先拿这个英文的来说,这呢就默认哎从小到大这个顺序呢给排了。
05:03
它能排的前提呢,其实就是能够比较大小。OK啊行,这呢是一种默认行为,咱们看到是没问题的,那可能我们就想这一个照猫画虎的,那看一下针对我们自定义的类能不能做这个排序的操作了,这块我提前呢,已经造好了一个叫做。就是产品啊,产品商品里边呢,有个名,有一个价格,这是两个属性构造器,盖赛方法to string,这我提前都写好了,这也比较简单,行,那下边的话呢,我们就创建几个商品,然后看看呢能不能实现这个排序操作了。好,这时候呢,我们就来,这个叫product。啊,写一个数组是吧,哎,你有一个product。来五个吧。啊,那下边呢,就咱们一个一个的给大家去做这个复职了。这块我们就先写这个叫商品的名称。比如咱们整几个。整你个手机得了啊。手机的话呢,比如华为的是吧。
06:00
华为,华为的哪一款呢?MATE50PRO是吧,然后逗号一下多少钱。5000多,5000多是低配是吧。6999啊,先来个他吧。啊行,这呢,一共整五个手机。嗯,1234是吧,好,这个小米呢,好像也要发了是吧。小米不是说要发了,然后后来又取消了,又发布会了是吧。泄露了吗?哦哦哦哦哦,明白了。嗯。对,一定要政治正确是吧。嗯。这个呢,我们诶给大家设置个价格啊,小米这个价格现在也都上来了啊。好,然后的话呢,再来。嗯,这个a VIVO好像也新发了一个手机。VIVO那个叫。嗯,哎,施教。要多少来着。
07:00
九灵。是X90吗?记不清了啊,我就写个价格了。然后呢,嗯,稍微的整个苹果吧。Pro max。这个我昨天呢,看到一个这个评论上说,说这个当年的说最具创新的手机,说把这个苹果14PRO还排成第二了,想不懂啊,苹果呢,这些年有变化吗。是吧?就每年跟挤牙膏似的啊,在这挤。嗯,价格低了是吧,啊九。嗯。所以有时候你看这个苹果的这个手机的最低配的就那个是吧,跟咱们这个这种手机的最高配的价格一样啊。这个确实是啊,你像那个小米那时还说说,那我们现在也卖到5000那个价,这个价格这个位置了,是吧,主要原因是因为苹果已经冲到万元了。他把这个5000那个档就给留出来了是吧,苹果在5000档的时候呢,那小米还得2000档是吧。
08:02
哎,始终被压一头啊。嗯,还有什么机子呢。啊,荣耀honor啊。啊,Magic系列是吧。卖之前出了一个四吧。上半年我觉得是。哎,是叫吗?那就四吧。这个来一个。咱来个6299吧。这呢,我就放了一些具体的这个手机了啊OK。行,这个完了以后呢,下边那如果呢,按照我们上边这个思路来的话呢,下边我们也要调这样的一个方法。说呢这叫排序好,排完序以后呢,我们也想直接就变利了。啊,就像模仿的我们说的这个string是吧,这样去做string的话呢,我们运行发现呢,确实呢,就排好序了。没问题是吧,但是我们这个的话呢,你要运行发现呢,还不行是吧。直接呢就挂掉了啊,他报了一个叫class class exception。啊,这叫类型转换异常。
09:00
对,说你这个呢,说不能够转换为comparable。啊,这个可能我们看的有点莫名其妙的是吧。哎,所以这块呢,我们看着呢,跟人家写的一样呢,实际呢还是有一些差别的啊。啊,你包括呢,像这个老罗罗永浩是吧,啊一开始这个造手机的时候呢,其实他选的这个风口呢,是没问题,但是呢,这个手机的这个市场呢,这个竞争呢,是极其惨烈的是吧,稍不留神呢,直接就挂掉了。啊,有时候你会觉得也挺奇怪的啊,你看这个手机的这个集中度跟汽车比呢,安卓汽车的集成度也很高。但你发现世界范围内这个汽车的品牌呢,是极其多的是吧?但手机的话呢,现在厮杀完以后呢,就那么几个品牌了。剩下的基本上都死都都死掉了是吧?啊,竞争极其惨烈哈。啊,这罗永浩我记得那时候呢,他这个手机发热,然后后边呢,就整了一个那个,呃,下着那叫石墨烯啊什么的是吧,结果呢,发现好像也不是太好使,就是你把别人手机你拆了个稀碎,然后你照着他那整,你发现呢按猫画的弄出来好像也差点意思是吧。
10:02
啊,他有些细节呢,其实需要你去。机电的是吧,才可以啊,你包括呢,像这个发动机,现在说那个咱们中国这个发动机呢。呃,这个战机上的发动机呢,说已经基本上替换了俄罗斯的发动机了,是吧,以前的话,这个发动机的话呢,一直是咱们的一个短板嘛。是吧,包括汽车也是一样啊,我记得之前呢,在这个长春,长春旁边呢,那不就吉大嘛,是吧?啊对有吉大,吉大呢,他们这个叫车辆工程啊,这个是跟清华呢是并列的是吧?呃,这个同一档的哈。啊,因为他不是有天然的优势,原来一汽在那儿呢是吧,然后呢,我认识那里边儿一个朋友,然后呢,他说他们实验室里边啊,原来呢,就是做相关的一些实验嘛,就把人家德国的这个具体哪个汽车品牌我忘了啊,然后把这个发动机就给拆了啊想研究研究看人家咋做的是吧,然后拆完以后呢,再装的时候装不回去了。啊,这个可能说,诶这个是不是跟咱们小时候装东西是吧,把这个收音机给拆了,然后一装的话呢,多俩零件是吧。
11:02
啊,他这个拆的时候肯定都录像了哈,但是即使这样的话呢,发现也装不回去啊,后来查资料才发现呢,它这个发动机呢,实际上是在零下很低的的一个温度下呢,组装起来的。那这样呢,在场温下呢,它的一热胀冷缩,它的密闭性就极其好是吧,所以你在场温下场完以后呢,再装就上不去了。哎,所以你看似呢,好像没什么讲究,其实里边呢,还有很多的讲究在里边的啊。啊,回到我们这个代码层面啊,这也是一样,你看似呢,它是string,我们换成了自定义一个类了,它呢包时。啊,这里边提的这个提示的这个信息啊,说的也非常明确,说这个product呢不能转化成comparable,那杨呢,就是你这个呢,是可以转化成comparable的。啊,为什么瑞能转呢?这个我们看下这个string类的声明。你会发现呢,它有一个的一个接口。他实现了这个接口了。诶,所以说呢,它就能转在我们当前这个product呢,它跟compable呢,可是一点关系都没有。哎,所以这块呢,我们要想能够排序呢,咱们也得类似于死砖一样。
12:03
啊,实现一个接口具备的这种比较大小的功能啊comparable,你看它翻译过来able呢,就是可什么什么的。Compare呢,就是比较的意思,所以呢,就是可比较大小的。哎,我们也这样去做啊,这呢就是我们讲的第一种排序方式啊,我们让这个product呢也去一下,这个叫comparable。啊,那呢,本身点进来它带一个监控号,这个我们其实呢,叫。啊,你要对就要发型就行,你要非说这个符号呢,你可以说叫算时操作符是吧。啊,然后呢,这个泛型的话呢,咱们还没有讲,所以暂且呢,大家就忽略掉,嗯,这块写了你就当没写一样啊,所以这块呢,我就啊没有这个监号的存在了,那么实现这个接口呢,自然而然要实现这个接口中的抽样方法,它里边呢有一个抽样方法叫做compare to。那我们这里边就要做一个实现了啊,咱们比如说就写到这后边吧,CTRL一下是吧,诶然后OK一下。然后呢,这个方法在我们的string当中呢,也给实现了,而且呢,我们还测试过,就是看谁大呀谁小啊,诶那其实我们也就知道了,包括呢,咱们现在呢,创建了好几个product这个产品,你说这块呢,假设给你排好序了。
13:15
其实你自己呢,都有点儿懵,我也没告诉你咋排呀。是吧,那你为啥给我排序了呢?诶所以说呢,这块呢,到底怎么去排,需要我们自己去指定,那指定到哪儿,就是指定到你这个方法里面。啊,所以在这呢,我们写一下啊,说呢,咱们当前的类需要呢实现啊AR中的。哎,中的啊,这个抽象方法。这个抽样方法呢,就是咱们下边的这个抽样方法。哎,然后呢,说在此方法中指明如何判断当前这个类的对象的大小。说你怎么算大,怎么算小呢,是吧,你得指明一下,那比如说哎,咱们这边呢,可以给他一个标准,咱们这儿呢,有商品的名称,有商品的价格,比如呢,我们按照这个价格。
14:10
啊做一个比较,价格小的呢就认为小,价格大呢就认为大,比如我们这儿就比方说按照。哎,价格的高低啊,进行一个排序。啊,或者叫进行大小的比较。啊,那要从那个排序的角度来说的话呢,我们可以理解成呢,比如说价格呢,就从低到高排序。哎,就这样的一个思路啊好,那我们看看该如何去写,那这个写的话呢,诶当初呢,我讲过E方法。诶,我说eo方法呢,大家呢,以后就不用自己去写了,我们可以呢自动的去生成对吧,在这块呢,不是al加insert去生成这个方法是吧?哎,当然呢,我们当初手写的意义是什么呢?说以后呢,我们需要呢比较对象的大小了,呃,跟这个ES呢有点像啊,其实说的呢就是这。
15:02
OK啊好,所以这块你要进来以后呢,咱们也可以呢,类似于咱们说的ES,先拿这个O呢,跟当前这个呢比一下,看你俩的地址是不是一样,地址要一样的话,那你俩对象是不是肯定就大小一样啊。所以我们这个就零了。诶,那这块呢,我们其实也多说一句啊,这个返回值呢是int类型,这个呢就是体现到底怎么算大怎么算小。咱们前面其实也做过类似的这个问题了啊,那就是如果返回值是正数。那就是当前对象大。就是你调离方法的对象啊。哎,那么哎,如果返回值是负数。啊,那就是当前这个对象小是吧。哎,如果返回值是零。啊,那就是对一样大。那这个呢,标准自始至终都是这个好,这个呢,你俩是同一个对象了,自然而然的就是一样大了,那回到这个层面啊,我们再去依附一下,那首先呢,判断一下你是否是一个。
16:01
你是不是个商品啊,是好,我们先给你做一个强转。哎,这个呢,Product啊这块我们来一个就是O是吧,那圈转完以后的话呢,咱俩去比较一下价格,如果你要都不是一个商品了。是在这儿干点儿啥呀?对,我们可以呢,抛一个异常。手动。哎,抛出。哎,抛出一个异常类的对象是吧,比如说这块我们就来一个啊。哎,你一个比如叫run嘛,这个呢叫类型。不匹配啊。行,这块我们就抛一个异常得了,然后这块呢,就相当于你是一个商品,你要是个商品给你做个强转,咱们刚才提到了,说按照这个价格呢去比。价格比的话呢,那就是当前这个商品的一个price。啊,它的价格跟我们这个P的这个price呢,比较,这个price是一个类型的。
17:01
前面呢,我们其实有过这样的经验了,咱们直接呢,就拿这个,诶包装类这个double有个方法叫compare,咱们把Z4.price和这个P的这个。Price呢,给它放进去。哎,这样去比注意啊。诶替掉这个price,注意这块你放的时候呢,前后有要求不。有前有要求啊,这个你写前面呢,就是拿前面这个跟后边的比,如果呢是一个正数,那说明就是前面这大。你要这俩交换了,那就反过来了是吧。好,然后呢,答得到的呢,就是一个int型的值了,我们就直接把这个值呢,给它做一个return就可以了。诶注意啊,所以这块呢,我们就是按照这个价格呢,啊做了一个排序。这个排完序以后呢,回过来,诶咱们这块呢,再去做一个。啊,方法的调用做一个for循环,此时的话呢,如果你要说类型转换,你想把product转换成comparable,是不是就可以转了。因为它实现这个接口了,所以就可以转。
18:02
他为什么要转呢?主要呢,就是他要用那个compare to的方法是吧,OK啊行,我们做一个执行。哎,你看这时候呢,就不再报错了,而且呢,既然我们都指明了按照价格来排了,诶你会发现的这个结果呢,就是按照这个价格的顺序呢给排下来的。啊,没有问题,行,那比如这个华为这个我们是6999,那如果说它的价格呢,跟我们这个。哎,跟这个荣耀的这个价格一样了。那这时候怎么办呢?嗯,哎,这块的话呢,诶把它呢就写上面了是吧,哎,这个呢,就相当于是如果出现相同的话呢,这块我们在比的过程当中,它本来就在前面了,就相当于在前面了,那如果这样的话,你说不行是吧,我们还得接着按照名字去比。也可以,那就修改你的这个比较的标准可以了。你可以在这块再去改是吧,比如说啊,我们把这个方法呢,咱们CTRLC一下,我把它呢给注释一下,咱们呢,再重新的给它重写一下啊这个事儿说明一下。
19:08
说呢,呃,这个比较的标准啊,知道我们是另外的一种方式了啊,说呢先比较价格。价格相同。啊,然后呢,进行啊名字的比较是吧。好,这个呢,咱们都啊,从小到大。OK。来这块我们看一看啊,那也就是我们这时候呢,其实得到的是一个价格的一个比较了,这个比如我们先得到一个英特性的值,假如这个值呢,就叫做Y6了。这个值的话呢,我们判断一下啊,如果Y6呢,是不等于零的。那说明咱们价格呢就不一样,不一样呢,你就直接return这个value就可以了。那如果说这个价格啊,不是这个VALUE6呢,是一样的啊,是零。那就说明呢,价格相同,价格相同,我们就接着比比name是吧。比内的话呢,那咱们就直接这四点。这呢是一个字符串嘛,字符串呢,它本身是不是已经重写这个方法了。
20:05
哎,我们再就p.price一下。诶,然后呢,把这个结果呢,我们做一个return。啊,这个呢,就。啊,P点了那吧。啊,比他们的名嘛。你看这块能行不?转过来,先比价格,价格不相同,返回这个值,价格要相同了,进一步呢,比较它们的名字。啊,OK了行,那这个写完以后呢,那么回过来,你看刚才我们在测试的时候呢。这个华为在上边,现在的话呢,这个应该是是不是荣耀该在上面了。都一,你看价格都一样,这俩都是ho呢,是不是要小一点。他俩不就颠倒了吗?运行一下。诶,你看这时候是不是他就跑上面,他就跑下边。OK啊,这个呢,就是咱们讲的第一种排序方式。哎,就说完了。啊OK啊行,这个说完以后呢,回过来我们在这儿去记录一下啊,第一种方式呢,我们现在就叫做,哎,现在实现了叫compar接口的方式。
21:10
哎,这样的方式啊,那么具体的实验步骤啊,我们在这写一下啊,首先呢,第一步。啊,第一步呢,我们相当于呢,呃,对应的咱们要排序的,或者叫比较大小的呢,是can product是吧,诶这样一个类的对象了,相当于呢,我们让这个具体的这个类呢,去实现相当关的相关的这个叫comp接口啊。啊,具体的类需要呢去实现。啊,Comparable这个接口啊,比如说这个具体的类A吧。实验这个接口,哎,那么第二步呢,需要呢,就是咱就要重写吧。啊,Comparable接口当中的compare to方法。哎,这个compare to呢,它这个参数呢,是一个object类型的啊。重写这个方法,然后呢,在此方法中。
22:03
指明是吧,比较咱们这个类A的对象的。啊,大小的标准。啊,在这里边儿呢,你写清楚到底怎么算大,怎么算小啊好,然后呢,第三步呢,就是创建类A的。多个实例了。啊,然后呢,呃,进行大小的比较。或者是排序。哎,或者是排序,咱们这呢,相当于是做了一个排序的操作啊,因为在这儿呢,我们直接呢,是调的这个so的方法,那么sot方法在排序的时候呢,他会呢,拿着这两个对象呢,比较谁大谁小,它是自动完成的啊,大家就不用呢,在这里边呢,再去,你说我想看看学校看也行,就一步的往里边走就可以了。啊,这呢,咱们就不用去具体看了啊,你说呢,我们要自己调一下行不行,那当然可以了。那不就跟咱们讲这个string的时候呢,自己调一下compare to类似吗?
23:00
啊,你比如说这个啊,CTRLC一下我粘过来给它呢,诶称为它叫product p。啊,这是一个啦,然后我们再复制一份,随便呢,我再挑一个。哎,CTRLC这个呢,粘过来这个我们叫P2。哎,那此时的话,你说P1大还是P2大呢,你就直接呢,调这个compare to这个方法你放进去就行了,这个我们去打印一下。啊,或者你要想看的细一点的话呢,你看这个值在这做一个判断。啊,这呢得一个int型的,我们叫compare。哎,你可以先这么着啊,然后下边写个一说,如果呢,这个compare呢是大于零的。哎,你就说呢,你这个P的是吧。哎,我就这样简写了啊哎,P音呢大一些。然后L是if。哎,小于零。哎,这个你就说这个叫P2档。哎,P1和P2一样大。
24:03
诶,这样就可以了,OK啊行,那么这个compared呢,这不就我们自己重写的这个方法吗。OK啊,咱们呢是比较这个价格,价格一样,再比较这个名,那价格上的话呢,显然呢是这个P2呢,这个要小它要大它减它,这应该是不是个正的呀。所以这块我们去必要的结果呢,就是P大呗。那就这样的情况。就是说呢,呃,一旦呢,我们重启这个方法以后,哎,如果你要比较大小,你就自己调这个方法,如果涉及到排序了,咱们现在是拿这个数组的这个so的方法呢来举例的,以后呢,我们在集合当中啊,也有类似这样的一些结构。到时候呢,不是数组了,就是集合了啊,总之呢,你让你这个对象所属的这个类是吧,它去实现这个compar这个接口就可以了。啊,就是我们说的这样的一个场景。OK啊行,那么咱们再拓展一下,比如回过来啊,如果呢,我们刚才呢,在重写这个方法的时候,咱们一直说的都是从小到大啊。
25:04
呃,那比如说呢,这个价格我们现在呢,想让它呢,从大到小。先不要价格。改一下从大到小。然后呢,价格相同了,按照名字排,名字呢,从小到大。这个怎么着?对,那就相当于原来大的变成小的,小的变成大的。我们在比较的时候呢,你比如说回到这儿啊。啊,现在他俩的话呢,诶,我减这个6299减去5999是个正数。现在你要让他得到结果是个负数,这个事儿不就变了吗?啊,如果原来变的是个负数呢,你能变成个正数就变了是吧?哎,其实呢,我们只需要呢,回过来在这个位置默认呢,它是一个从小到大的,你现在让它从大到小,我就这块儿呢,变一个负的就行了。正的变负的,负的变正的是吧?哎,来一个相反数,那这个name这块呢,是个字符串,还让它从小到大,那你就这样写,如果在内呢,也想从大到小。
26:05
就这块儿呢,也整个符号就行了。啊,就可以了啊好,这个咱们把它就去了,行,我在这呢加了一个符号回过来,咱们呢在这儿排个序,你看是不是这个价格呢,就开始降序了。没问题是吧。哎,就这样啊,然后都是6299的情况下呢,这个我们还是按照升序来的。嗯,你在这块呢,补一个负号,这个呢就变成也是降序了啊。行,这个呢,就咱们说的第一种排序的方式啊,就说完了。
我来说两句