00:00
行,那复习完以后呢,咱们这个讲map之前先来看一下,咱们这这个讲到目前为止啊这章的这个练习,这个练习的话呢,第一个啊,这个呢,是练一下咱们关于吹赛的这个自然排序和定时排序啊这块这个重心呢,呃,还是落脚到这个叫自然排序和定时排序,实际上这这里边这个知识点呢,还是咱们讲常类时候提到的这两个接口,只是呢,现在咱们用这个呃吹set这样的一个容器去承载这个对象了。啊,因为这个这个容器有个要求,就是我放到这个容器中的这个对象,由于吹ET的底层是用的树啊,准确的是呢,叫红黑数,这个红黑树的话呢,它存储的这个数据是有这个排序的啊,就是我们提到说比它小的放这边,比它大了放这边,那进而的话呢,我们就需要啊用到呢什么呢,就是你往这里边放的对象呢,得是能排序的,那我们就要求这个对象得跟comparable,或者是compar上呢去打交道啊是这样的这个原因啊,那么咱们目前呢,先做一下这个题目,这个题目当中咱们先没有讲泛型,诶我们在看这个API的时候呢,大家会看到这个comparable,或者是这个compar呢,它其实都是带泛型的,什么叫带泛行的,就是CTRLC,我们在这ctrl shift t看一下这个源码啊,CTRLV一下,在我们这个接口,或者大家看某些类当中啊,你打。
01:32
开以后,后边呢,加了一个监括号,中间呢写了一个,呃,其实是一个类型了啊,这其实就叫泛型,这个泛型呢,在咱们讲完集合以后呢,咱们下一章来讲这个泛型的事儿,目前呢,咱们还没有涉及到泛型这儿呢,大家就都忽略掉,讲了泛型以后,咱们还可以对这个题目呢进行一个重构啊,用上泛型以后呢,这个就更好了,相当于那么我们回头讲泛型时候呢,对它进行重构,那重构之前呢,咱们得先把这个题目呢,先没有泛型的时候,看是什么样子,得先做一下啊,那这块呢,咱们就一起来写一下这道问题啊,其实呢,不是特别困难了啊,这里呢提到我们把这个员工放到这个吹彩的当中,那就要求这个员工呢,哎,你得是可排序的,这呢就提到了两种方式啊,让你去做,那首先咱们得先把这员工类呢得造出来,涉及到了一些属性内幕,Age和birthday birthday呢又是另外一个我们自定义这个类的类型,那不妨呢,我们就先把这个my date呢。
02:32
那先创建一下啊,这样CTRLC。这呢是咱们的一个,呃,练习我们就写到这里边了啊呃,这个再去这再去新建一个吧。新建一个包,新建个包吧。行,在这里边首先呢,我们创建一个class叫my date啊,这个类,这个类的这个说明啊,CTRLV咱们粘过来,按照这个说明呢,去写private啊,Int类型的页啊,这个叫month啊,这个day,好,接着我们去提供它这个构造器和盖塞方法,Out shift s,通常呢,都先有个空餐的,Out shift s代餐的,把这三个呢都加上,OK,哎,再加了个盖赛的方法,哎,这个三个都选中啊,OK,行,那再加一个突诉人吧。
03:37
行,这呢,我们这个类呢,就造好了,哎,比较简单了,接着我们再去提供它的这个,呃,Employee类。CC。Employee粘过来好,首先声明属性,Private的词缀,类型的name。
04:10
Private age private my date类型的。行,这是咱们自定义的啊,没有用那个现成的U下的data去表示,嗯,OK了,然后呢,每个属性盖塞的方法,构造器写一下to string呢也写一下行,Auto shift s先构造器空餐。盖餐三个都要盖餐方法。三个都要加个出死。好,OK,在这个twoth string当中呢,哎,去输出一下我们这个name位置,还有birthday birthday呢,在这个位置呢,它就调查自己的这个toth string,呃,就输出了,呃,自己的这个twoth string,输出一下它的这个呃,年月日啊这样个情况,好,这样两个基本的类呢,我们就创建完成,接下来我们看下这几个题目的要求啊,去造五个employee的对象,把它放到我们的吹ET当中啊这呢就涉及到这个排序了,诶我们呢,就使用两种排序中的任何一种去做,哎,找到我们专门做测试的,哎,我这呢就都写到一个这个包下了,哎,关于这个我写成这个employee吧,Employee它的一个测试,哎,把这个要求呢,我们CTRLV粘到这儿,首先呢,我们来写这个用自然排序来做。
05:50
那这呢是针对咱们这个叫呃问题一啊,相当于是使用自然排序,现在呢,我们希望把这个employee呢,造五个对象放到我们这个吹赛当中,那首先呢,把这个吹塞呢先造出来。
06:05
嗯,接下来呢,我们把这个set里边呢,我们去艾特这个具体的这个对象啊,你在这里边new也行,或者提前我们把这几个对象呢,造出来,填这个变量名也OK啊,比如这个EMPLOYEE11啊,New一个啊employee这个呢,我们调用它带参数的这个构造器,直接呢对现有的几个属性呢,进行初始化啊,Ctrl out,斜杠先写name,写name这个我们写上刘德华吧,写拼音啊这个A。这就50多了吧。快60了吧,得55吧,假设啊18,嗯,然后呢,再去new一个my date my date呢,CTRL的斜杠也有几个参数,呃,这这个我就不去算了啊,比如你要55还得减一下,然后哪一年哪一哪日有点复杂了啊,这个我就呃随机的写几个时间了啊。
07:02
呃呃,别别随意整54张了,5月4号啊行,这呢是咱们相当于造了一个对象啊,然后呢,我这块呢,他让造五个啊,那就咱整五个下2345。五行,嗯,刘德华整个四大天王吧,四大天王后边就别再扒了啊,这个张学友郭富城黎明再加一个加一个那个眼神特别啊,对梁朝伟,嗯,一说就知道了,嗯,张学友,张学友这歌神哈,郭富城郭富城这也是算影帝了啊对,跳舞特别好,这个唱歌特别好,黎明呢,长得特别好是吧?啊对,那四大天王里边这个其实你要一开始猛一说,刘德华其实一开始最不突出哈,这个当初这个张学友这个唱歌那绝对是秒杀另外三个是吧,是不一样的哈,哎,郭富城那跳舞好,这个长得帅哈。
08:22
刘德华其实好像哪个也不怎么占,其实就是拼命嘛,是吧,啊,确实这个刘德华这个在整个香港这个圈呢,应该地位很高啊,比其他几个要高一些人品是吧,这个人品呢,你得落实到最后一位了啊,但是别装,装的话呢,这个可能就装一天就装不下去了,蹦了就是吧。嗯,行,嗯,然后梁朝伟梁朝伟这个1234整一个21吧,这啊嗯随机写的啊,后边呢,这个时间呢,咱们也稍微的给它这个动一动啊,这我写两个年一样,月一样,日不一样的,嗯1954啊一九嗯七八啊这个我随机写了一些这个数啊12月4号八月。
09:18
12号行这个就这样处理了啊,写了五个以后对象,我们把这五个对象呢,放到我们的这个,呃吹set当中以。好,这呢,我们就往里边去做添加了,哎,添加的时候呢,这时候你得注意我们吹菜的呢,要求放的数据呢得哎用红黑数这样去放,放的话呢,你得比较一下,一一呢放过来以后,那1212放到它的左边,放到右边了,这时就得比较大小了啊暂时呢,咱们还没有让这个employee去实现这个compable接口,所以呢,此时你去做添加,它就会报错啊说呢class class exception提到了这个叫comparable啊,没办法呢,把它转换成comparable呢,进行compar to的一个调用,所以此时我们就需要呢,使用自然排序嘛,让我们的employee啊去啊,Implementments咱们的comparable。
10:20
Comparable,哎,他了,那么这时候呢,排序看看它这个标准是什么,说按照这个name排,就按照这个姓名排了成,那咱们过来呢,继续重写这个compare two。Compared to里边就按这个幸运牌,这个咱们也写过了,说if,注意这个compared to的话呢,就没有说系统帮你自动生成了,跟equal不一样啊,所以这块呢,需要我们自己去写,那o instance of。Employee,你要是的话呢,先转过来这个employee,这写一个O,转过来以后呢,判断或者就不用判断了,直接呢按姓名直接就return了,当前name.compare to e的get name或者E直接调内也可以啊。
11:14
按照性名排,那我们目前呢,呃掉的compare to呢,是用的死string现成的,现成的话呢,是从小到大,哎,那就从小到大了,这个排完了,没有说再按照什么年龄啊,或者这个生日啊去排,只指明了一层排序,那就一层,这是一个衣服,那万一呢,你要传过来的不是一个employee,对抛异常也行,或者直接大概零也行,你想想就是相当于你要抛过来的,呃,传进来一个不是一个employee,我不抛异常了,零其实就意味着你跑你你过来这个数据是不是就进不进不来了,因为咱们吹赛当中不能放相同数据嘛。相同的数据呢?不就是RETURN0吗?啊,所以用RETURN0也行啊,或者说你这时候呢,严格的让他报个错误,说你这个就绝对不行啊,不能放,哎不一样的数据,那你就去有一个啊exception传入的,呃,数据类型不一致,好这样就行了啊这个咱们相当于是啊,按照姓名的这个顺序排。
12:26
CTRLC行写完了,写完以后,这时候呢,我们再去执行,它就不会报错。啊,这就没事了,行,那么接下来呢,我们去便利一下,你看这个添加这个这个便利的这个顺序是不是这个真正我们把它排序了啊,这个咱们就可以用几种方式之一了,不妨呢,我们再熟悉一下这个迭代器塞点。Well。像以前咱们讲这个循环的时候呢,提过说到底是用while呢,还是用for呢,实际上呢,就具体问题具体看了,像这呢,咱们用这个while呢,就看着这个格式比较好看,你要改成用for呢,你会感觉别别扭扭的啊,就是也能改,只不过改完以后呢,不太好看,写完了此时呢,我们做一个便利看一下这个结果,首先呢,不是按照我们添加顺序来的。
13:26
那接着具体去看啊,这呢都是按照这个哎这个字母来的啊,哎,尤其你看正好呃这个Li都一样了,再往后去比这个A啊MU。先后顺序来行,这呢就是我们说的这叫哎自然排序啊,这呢说一个小点啊,就大家呢写的时候,有的同学呢,可能这块去写中文了,一样,写中文的话呢,就按照中文排排序,但是中文里边呢,我这就不写了啊,大家呢有的同学写可能会出现一个问题,什么问题呢?说比如说这个黎明哈。
14:00
是立明,然后呢,这个张学友,哎呀学学学生。张学友啊,写的时候呢,按说或者大家呢,会认为说这个离呢,应该是出现在上边啊,张学友应该出现在下边,毕竟呢,你说这个感觉上说的这个Li是吧,啊张呢是Z开头的,但是呢,真有可能大家呢,你去写的中文遍历的时候,你发现张学友出现在上面的。说呀,是不是我这个compare to方法写错了,看了看也没错啊,那这块呢,可能是什么原因造成的呀,哎,对啊,就是嗯,我们呢,你写的是拼音,你这个呢,按照abcd的顺序,那你要是写的这个中文的话呢,我得按照中文,你compare to,那就意味着我们现在用UTF杠八,你得算一下他们这个数谁大谁小,那有可能也确实是这样子的啊,当然只不过不可能,可能不是这个离和张了。啊,就是这个张呢,它的这个算出来这个值跟我们这个离的这个值去比的时候呢,有可能张呢就是小,所以呢,把这个张就放上边了,这是因为这个给中文分配的时候呢,它不是完全按照abcd的那个顺序去分的。
15:13
啊,因为你想象一下有一些那个中文的汉字,呃,它那个字的话呢,可能大家很少去用,但是呢,万一他就占着这个是B开头的,就没有必要给他又分配的特别靠前了啊是这个意思啊。行这块呢,大家注意一下这个小问题就行,不是说我们这个方法写的有问题啊,但是大家在这个通讯录里边,你会发现你要有黎明,也有张学友,那肯定黎明呢,是在大家的通讯录的上面,那他怎么做到的?它就相当于是不能按照这个汉字去找这个对应的这个值去比大小了,而是找你这个汉字对应的拼音,找到拼音以后呢,我按照拼音去比,这样的话呢,它就按照,哎,咱们所谓的L呢,应该在上边,Z应该在下边了啊,那这个呢,汉字找拼音的事儿呢,大家其实也不用自己写,像这种比较常用的事儿呢,网上去找他一定会有开源的一些炸包,直接导进来用就完事。
16:10
啊,你找那个炸包里边呢,你导进来告诉你用哪个API,你把这个汉字呢,就相当于有个方法啊,你把这个汉字呢,往里边一扔,它就给你return一个啊,你返回的就是一个拼音啊,你拿二类拼音呢去比看谁在前面谁在后边就行了啊像这个事呢,这个比较长的这个结构都做好了啊好这个呢是咱们说的这叫自然排序,然后这提到一个叫定时排序,按照这个生日排啊。那么第二按生日。Public avoid test12。这么着说,按照这个生日的先后顺序去排,前面这块呢,其实啊,这个构造器当然得变了啊,最下面也得提供出来,然后再往里边去艾特添加CTRLC这个呢,不妨我就都拿过来了,只不过呢,这个位置我们得传入一个参数,所以提前呢造出来啊compar,好啊,我就要come了啊,或者我这块不想显示的去造个对象了,是不是也可以在这里边直接去用,哎,因为你就用了这一次啊,就懒单呢再去给大家声明一个对象了,另一个comp直接呢一回车啊,这个结构我看基本上都给你呈现出来了,在这里边我们希望呢,是按照生日的先后顺序排。
17:36
先后顺序排怎么写,先得保证你这个O1和O2呢得是employee对吧,先依附一下啊,O1INSTANCE of employee,并且O2INSTANCE of啊employee,那你得都是啊,都是呢在比然后这块呢,一个else,或者不写else直接在这写还是啊瑞零也行啊,瑞零你就进不去了吗?
18:03
或者呢,还是去new个。传入的这个数据类型不一致。好,这呢也可以啊,下边呢,我们关键呢,关键呢来看一下这个衣服里边。说如果呢,你们都是一个employee,先做一个转换OE。这是一个O2,好,接下来怎么写,接下来的话呢,你在这里边就相当于去比这个生日了,生日的话呢,比较大小,这呢没明确说,那你就按照小的生日,呃,就是数小的啊,数小的往前放,所谓的数小呢,你像这两个谁数小啊。对,1965数小,这个大家注意,就是咱们这个日期这个date类,它也可以默认的进行这个自然排序,这个date呢,认为小呢,就是你这个数小,你你别说说,诶这个生日呢是六五年,六五年的比这个八七年的大呀,哎,别这样说啊,就纯粹的看数数小的就是小,那我们这儿也是一样,把这个六五呢,就看的小一点往前排,所以我们其实得先去比较年,年呢小的就往前放了,年一样的再看月,月还一样的再看日,那这块我们这样来写。
19:30
首先呢,获取这个一一的要get一下birthday啊,得到它,哎哟,得到它的这个birthday啊al enter,生成一个变量加2B1吧。哎,生日这个要B1,然后再接着呢,拿到这个一二的。行,那么拿到这两个变量以后呢,我们先比较它们的这个年啊,这呢我就比较粘了,我先get了它的一个页,嗯,减去B2.get这个页,这呢得到我们这个页之间的一个差距啊,In的一个啊,这个我们叫一个啊sum啊sum year这样吧,一个差值相当于是啊呃,那么我们判断一下啊说如果。
20:20
嗯,这个差值叫sum也不太合适哈,相当于是miniins出来的啊啊差值的这个页这个值,那如果呢,怎么着呢?如果它要是不等于零的,说明了你俩这个年不一样,我就直接re return这个值,那如果呢,你两年一样再比较约吧,月呢,相当于我这块是不是得写else了,或者我要不写,我直接在下边这个写是不是也相当于是else,对的啊,那接下来我们再去计算一下叫的一个month。B一点get一个month,减去B2点get一个month,然后还是if啊,如果这个miniin的这个month呢,是不等于零的啊,直接return一个啊miniin的month啊,就是越不一样,那月不一呢,直接去return,那能走到这,说明月呢又一样了,月一样呢就剩日了,那就只能是return,直接B一点get一个day,减去B2.get个day。
21:29
再没有其他的比较了啊,最后呢,就比到这个日这块就OK了,是不是就这样写。在这写一下这个简单的一个逻辑啊,这是比较比较。来边角这个值啊,写完了,写完以后的话呢,我们把它呢做一个添加,添加完以后呢,再做一个遍历CTRLC好写完了来我们看一看啊。
22:08
出来了,出来以后我们看看,哎54年65年78年8787,哎看这是年不一样的时候呢,按从小到大年一样了看月,月一样了看日。就这样来处理,那比如说我们现在呢,这个假设啊,我们这儿呢,也是一个5月4号说呢,张学友和郭富成呢,都是87年5月4号出生的,这个会出现什么情况,郭富城是不是就进不去了,对的。那只有这四个了,郭富城没有,那这呢,就咱们讲过的这个事儿啊,就是说呢,诶我们此时在吹赛当中,它就完全按照compare,和compare to方法去判断呢,是否相等了啊,一旦要相等的话呢,这个数据呢,就进不去了啊这呢是这个点啊,当然这块呢,你可以怎么办呢?你说我就希望这个郭富成进来,那你可以是不是再指明这个二级的一个排序,对,你就加上比如说这个呃日也一样了,你再看看这个年龄,呃年龄或者说我这个name啊也行,就避开,你让他们返回是零啊,只要避开是零,我就能够想办法把你放到这个这个阿尔法树当中的左边或右边,嗯,因为你相同的,你不可能放我这儿了啊行,这就我们这个问题啊,嗯,这个呢,再多说一句啊,就这块你看我们写这个逻辑呢,写的比较长一些,大家呢,这样写也没问题,或者还可以怎么做呢。
23:34
还可以,大家把这块这个逻辑,这是关于这个my date去比较大小的事儿,你把这块这个逻辑呢,可以写在我们这个my date这个类里边,相当于第二种方式啊,大家呢,可以让我们这个my date呢,去implements一下呢,叫comparable来看能不能理解啊,然后呢,Al enter一下,实现一下,这个叫compare to方法啊,比较一下说这两个到底谁大谁小,然后回过来,咱们这块呢,我粘一下这个代码啊,嗯,粘一下呢,我就直接把这块代码到这块呢,我CTRLC一下,看看能不能看得动粘过来。
24:14
嗯,这个B1呢,其实是我们当前对象,这个B2的话呢,是你先判断一下,说如果这个O叫ince of叫my date是的话呢,我们先做一个强转,这个呢在这个里边相当于是B2了,啊这我就写成一个M了。那data我写一个O,那接下来把这个代码呢,CTRLX我放到这个里边呗。然后把这个B2呢改成O,改成M。这个呢,还是咱们当前的Z4这个改成MM,哎这个写完了,然后呢,就是当你要不是一个my date,哎,我们还是这块让他去抛一个异常。
25:02
CTRLC写到这了。哎,注意你看我写到这了啊,相当于我们把这个my date呢,比较大小的事呢,在我们这个类当中呢,做了相当于是个自然排序的一个形式,然后回过来说这块呢,你就没有必要这块整这么复杂了,诶我们就可以从这到到这块我们都注释一下啊,注释完以后这块我写一个简单写个这个咱们的方式一了啊。哎,方式一,然后这块我们不用在这里边指明了,这个方式二说呢,如果你们两个呢,都是这个employee,然后我都获取你们一下这个my data,然后在这里边我直接就怎么写。Return叫B一点compared To B2是不是就搞定了?哎,那么回头呢,你如果还需要做这个定式排序,这个我们你要这还还用方式一去写,你还得自己再写一遍,那我们呢,在麦里边洗了以后,你回头呢,还可以直接掉它就完了啊看一下。
26:11
哎,这呢也是OK的啊,那也没问题,其实就相当于什么呢,咱们这个第一种写法的时候呢,我们在employee当中,你不也调name的这个compare to了吗。那name呢,因为string已经写好了,现在呢,我们想调my date my date没写没写,那我就在你这里边写一下啊也行啊,这呢是两种小的这个方式啊,体会一下就行,这呢我们把这个实验题呢,现在就搞定了,大家下来呢也可以再写一写,那通过这个呢,主要其实还是熟悉我们的两种排序方式。
我来说两句