00:00
下一个呢,要给同学们讲解的内容呢,就是我们这儿一共出了大概有三个题啊,我们讲了这么多应用呢,我们有必要哈,再做一点练习,加深对前面讲这些操作的一个认识,那都很简单,都很简单,但是呢,有必要还是写一写好,我们先来看第一个练习题,来走一个,先把题的要求走过来,叫集合综合应用案例。哦,毕竟呃讲了这么多,你要是不去用一下呢,就感觉好像还是对吧,呃没有没有着落就感觉很虚,我们把这个练习题呢给他讲讲几个题好先看第一个课堂练习题一。课堂练习题一那么课堂练习题一呢,我们来看看他是什么要求,然后呢,我们写代码就可以了。好好,首先他告诉你,这有一个sentence是一个字串。啊,有这么多字符。这个生态中的各个字符呢,要求通过这个左折叠,左折叠。
01:05
二存放到一个buffer中,目的,理解float knife的用法。啊,Float left,虽然我们前面讲了,但是我们重点讲的是它的运行机制,但是到底是什么用法呢?我们还要举个例子,注意听它的意思啊,是说将各个字符串通过左左这列放在这个buffer中,你可以这样理解,就是将来有个2BUFFER。你将来说最后得到的是一个buffer。Buffer里面放的是buffer里面是什么东西呢?就是A。A。诶,等等等,就是把里面这个东西一个一个取出来,扔到这个buffer里面去,他是这样一个提议啊,就你有些东西可能连提议都没有明白,就说他是把这个整个拆出来,放到这个打散,放到这个我要的这个buffer里面去,就是这么一个提。那这个题好不好做呢?应该说还是很简单的,因为我们刚才讲这个左折叠,我说了一句话,左折叠呢,最后最终它一直是向一个一个那个就是你传的那个第一个那个值往里面折,那我们就充可以充分利用这个这个特点,明明白意思吧,好,那么现在呢,我们来看一下这个代码,简单的一个实现,你看这里我写了一个PUT8UFF分,我接收左边,我接收一个28分,然后呢,来一个我就存一个,来一个存一个,最后我把这个再返回去,那就说整个这个折折叠的过程中,其实我只是针对同一个28分来操作。
02:35
这个代码就写完了,对吧,那么现在呢,我们来进行一个简单的使用,看看能否把这个跑起来,好我们来写一下啊,这个案例呢,给他写一把。大家注意听exe。Re 2CC02就是我们的第二一个练习题,好的,各位同学来我们写一下这个题,如果突然让你写,你你不一定写的出来,就是因为我们见的太少了,所以说呢,老师呢,给他这个案案例呢,过来写一次好,有些我就偷一个懒了啊,像这个玩意儿,我就。
03:09
自己。弄一下啊,拿过来我们写一下代码,好,这是我写一个啊,我写一个函数。啊,比如说就叫put putray啊,Putra就把这个东西放到一个数组里边去。好,然后呢,我们要深刻的理解这个左折点,首先呢,我要接受的是一个,呃,这个2BUFFER啊,比如说我就叫写个二叫二瑞buffer。Buffer呢,它是一个可变的啊buffer ber,而这里面这个类型呢,我要指定四个差。啊,当然这个做完以后呢,我这边要接收一个叉,就是你要想办法给我一个叉,我才往里面放,最后返回的类型呢,始终返回的是这个buffer的类型,就是把它返回去,那这个时候我们需要怎么样呢引入这个包。
04:03
好,现在我要做一件事情,做一件什么事情呢?将将。将这个C放入到哪里呢?放入到buffer,这个ruffer放的是,呃,放入这个buffer中啊,这个中,那我怎么放呢?很简单,因为我们前面学过往一个buff里面放的时候,它有一个方法叫。啊,不能直接扔进去就是了,做完以后返回的就是它本身这个代码就写完了。就就这么一点,然后呢,我们要做的事情呢,就是叫左折叠开始来玩,左折叠怎么做呢?Sentence它是一个集合,虽然它是个字符串,字符串是属于有序集合的一种,然后点flow。Left我传第一个,那第一个参数呢,就是要传它,那我首先定义一个这玩意儿V,然后我写一个RR8UFFER,等于咱们六一个2BUFFER啊,六一个2BUFFER,然后呢,这个类型我们放的是二。
05:08
啊,这个我们前面都讲过的啊,然后我要放的就是它。就说这个就是我们的头部,因为。不停往这边折嘛,啊,就它往这里面放,这样就理理解这个折叠,其实它最后这个结果其实是可以指定的,它很灵活的,然后这边我要传让哪个函数来完成这个折叠呢?就是我们的put差,好这个案例我写一次啊,后面我可能就不不再写了代码,因为比较简单,我直接给同学们看一下,最后这个buffer是什么,因为buffer是个引用的,大家知道集合呢,它是属于这种呃,Any refer的这种类型,所以说呢,你在这里面这个它的改变就无需再接收了,直接打出来就行。好,我们看看这个东西返回类型是不是跟我们想的一样,运行一下。好的,当我们运行完了过后呢,我们可以看到跟我们想的就一样了,它其实就是把这个每个打散往里面放,这个最主要的作用啊,这个题的作用主要是让大家再次理解这个折叠。
06:13
折叠,反正你只要想办法给我传一个参数,左左边因为折叠的时候它是呃,第一个参数就是你你就这个玩意,然后里面这个put的第一个参数就是从这边一个往里面扔嘛,我们讲过这个东西理解哈,如果你没有这个怎怎么办呢?说老师假设我折叠的时候,因为因为因为左折叠它是要求你必须要传一个的。那如果说你用的直接是reduce left呢,其实它会默认从这个里面开始,一个个往里面找,明白吧,这这这一点大家注意一个区别啊,左这里你就必须要传一个,它的作用就是相当于说都往都往这边去操作。好,这个代码呢,我们就理解了啊,就是理解。理解这个左折叠啊,折叠吧,叫折叠的这个这个第一个参数的含义,第一个第一个传入的这个传入的啊传入诶传入的这个参数就是这个东西。
07:14
的作用是什么,它的含义到底是干什么的好,这个当然也取决于你后面代码怎么写的好。第一个题我们就评讲到这里,好,紧接着我们来看第二个题,第二个题呢,也异常的简单,他说什么事呢?他说还是一个字符串。他要求使用集合映射统计一句话各个字母出现的次数,并且保留在一个map中。保留在每一个map中,那么这道题如果同学们用Java写的话,我同我我个人感觉应该没有什么问题,大家看我已经写了一段Java代码,因为我讲开了,Java呢,我就简单说一下就行了,我不写了啊,因为我的重点不是讲Java,那如果你这个写不写不出来,那就是你Java的Java的问题,Java没有过关,那就回去再想一想,那看我的思路。
08:04
那么我这里先定义了一个map类型char count map,然后呢,我这里指定了一个泛型,我做了一件什么事情呢?首先我先将这个sentence这个字符串转成了一个char数组,这个大家一看就明白,就to char,这就变成一个char数组了,然后我用了一个for循环的增强,看到没有?For循环增强,我从这个CS及字符算速度里面不停的取出这个差,我干什么事情呢?我要进行判断,并。去统计,首先我判断一下你现在有没有包含这个C,如果你这个集合里面已经包含了这个A,说明已经家居混的意次,就你曾经往这个map里面放,放进过了一次,所以说呢,我就取出这个count值加一,再重新放入。啊,这个我相信同学们应该能看懂啊,如果这个代码还看不懂同学啊,那你那你赶紧看一下Java基础,那么else呢,就说明你一次都没放入怎么办呢?那我就直接放入初始化唯一就完了,这个代码我也不去运行了啊,肯定没有问题啊,我这只要是写出来代码,我肯定都是跑过的啊,不会把跑不过去的代码写到这儿啊,肯定都是能跑跑通的。
09:19
好,同学们有兴趣自己去跑一跑,我这个就不跑了,那我重点要讲的是什么呢?是是看了怎么实现。啊,这个是我要重点讲的,那么同学们可以看到开这个地方我怎么写呢?这这个地方稍微理解起来有一点点难度啊,各位同学注意听。那么我稍微的给大家说一下,因为基本的原理都说完了,下面呢,就是我们的应用,我写了一段这个代码,首先深这个代码我相信能看懂,就是一个字符串,这个没问题,然后呢,我做了这样一个工作,大家看你们先不要去看这个圈count,你看这sentence左折点,回想一下刚才那个我们写的个用瑞buffer来打散的那个东西啊,我在这里传入了一个麦普。
10:05
Char的大家,大家看,我这里其实是传了一个匿名的一个map。而且大家看这个是map是可变的还是不可变的。能看出来这种写法是可变的还是不可变吗?就是不可变的,我传了一个map,我穿越一个map过后呢?呃,我传了一个这个不可变map的一个实例,大家看我为什么是实验,是因为我后面有小括号是一个空的,然后我调用了个插com,我做了件什么事情,大家看这代码。这个叉开里面接收了一个你传进去的map,然后接收一个C,这个C我讲了左折叠。它是左折叠,它是这样干的,第一个左边的参数是你来指令右面的这个,第二个参数就是从这地方,它会依次便利往里面扔。啊,这是再次理解,那么我扔的时候我怎么办呢?最后我还返回一个map char抗争。因为最后结果人要放到这里面吗?那我干什么事情呢?我做了这样一个动作,大家看能看懂吗?
11:04
其实并不难,这个操作就是map的一个操作,我说了map肯定有用。map加。加一个什么玩意儿呢?加了一个新的原新的这个这个K86,这个K是C。K是C,就是你传进的这个值,那么值是什么呢?值不确定。为什么不确定呢?因为如果你这个C我取出来了,看看map.get or类似,我就加了一个逻辑,就说如果这个C有。是不是就返回你是多少就是多少,如果C没有返回一个什么零,是不是这样子就有效的解决了这个,呃,这个判断就说如果有就把这个原子返回来,再加一次一,如果没有,我就取个零再加一个变成一,然后给它扔进去,扔进去同学们还记记不记得有个逻辑,这个map的家,如果这个K存在就是更新,如果K不存在,是不是就是家呀?啊,这个逻辑一下就一句话就全部写完了。
12:05
但是有同学老师,我我想把它分开写,行不行也可以,我这是故意写了一个相对综合的,那同学们我们来跑一下啊,这个代码我们来自己再跑一跑,好,现在呢,为了呃区别呢,我不写在一起,我新建一个文件代码呢,其实并不难。啊,当然同学们还是要理解一下啊,所代码呢,虽然不难,呃,但是呢,你要说是自己独立写,还是要动动脑筋的,那老规矩,我们先把这个拿过来,同学们,我们给大家做一个小小演示。好,我们先写了一个函数,叫char count,是这意思吧?好,然后插里面。我接受了两。接受了两个参数,因为你左折叠它需要两个参数,第一个参数呢。第一个参数我是这样写的啊,就是我接收接收了两个参数,第一个参数我是这样写的,就是给我传进去一个map。
13:04
对吧,传进去一个map,这个map的类型是这样写的,Map。然后这面有一个。呃,先一个差,再来一个in int是这意思吧,然后这边我们要还要接受一个差本身。Char本身捞传奇一个叉。好,最后这个类型返回这个类型呢,也要求是这个类型是这样子的吧。好,这个做完了以后,我们做了一件什么事情呢?特别简单一件事情,就是你传递的脉谱,我进行那个加,我怎么加的呢?我有逻辑,我这样写的脉谱。点盖着or less or less怎么样呢?我去尝试着去取你这个圈。这就有两种可能性,取道或者是没有取到,如果取到呢,就是元素,如果没有取到就是零。然后我们再把它这个拿到以后,应该是这样写的啊,这少写了一句话,应该是C指向它。
14:05
是这样写的吧,啊啊,这是差,这写了个这个差,然后这边呢,呃,我们再加一个一。啊,这样加一个一就会报错,报错原因因为我们没有把它包起来。好,这样大家再写了一遍,大家应该印象更加深刻了。好,这样就写完了。啊,这充分利用了map的get w和他这个加的一个特性,加的意思,有就加,没有就更新,呃,有就是更新,没有就是加,然后呢,我们来调了一下,调的时候呢,我这样调的,我用sentence。点。我们左折点float。Map,然后我在这里,因为这个map本身呢,我直接传了一个什么呢,我直接就传了一个呃,空的我这样写的map。Map,然后这边有一个叉。啊,有一个叉,然后类型是int类型,然后这边呢,做了一个包裹,然后传完了以后,我们这个地方又做进行啊这个是传参数,然后把谁传进去呢?把这个char count传进去。
15:14
这边是不是少了一个六啊。少了一个六。啊,这个叉看的啊,这个是应该是写成什么呀?中呃,这个中括号,哎,中括号别写错了。啊。哪写错了,那这个怎么是变成这个都行了,它float啊fold fold left。Fo left,好,然后这边是哪里写错了,大家看出来了吗?六其实是可以不要的,对吧,因为我们麦这边用的是它的那个啊play方法来怎么样构建的,这样写完了以后呢,同学们可以看到啊,最后返回的这个结果就是我要的结果啊,那我写个MAP2就写完了。
16:01
卸完了,然后呢,我们来打印一下这个map。MAP2轴等于加一个MAP2执行一下,我们运行过后呢,我们可以看到这个结果跟我们想的就是一样的了,你看10A有十个,B有八个,C有五个,D有七个,同学们看,现在我用这个方法呢,其实不是很好理解。不是很好理解,因为我用的这个map呢不太好,我用的是不可变的map。而且这个地方大家看到每次你因为不可变传进去过后呢,其实你加完了后返回这个新的,只是最后被累积起来,效率比较低下,因此呢,我要求同学们想一想,能不能改成另外一种方式,改成可变的脉搏来玩。其实也是可以的。其实也是可以的,如果我们用可变的map来写的话呢,我们这边再写一份代码啊,第一份我们用的是不可变的map啊,这个加深一个印象,因为你这个不可变的map呢,最后其实你这个map本身没有变化,只是他每次产生一个新的map嘛。
17:05
对吧,所以说这个不划算,所以下面呢,上面这个是用的是不可变map实现的。是使用。使用不可变不可变map实现的对不对?下面呢,我们来换一个套路,使用什么呢?可变脉谱,可变脉搏来实现。这个同学们能写出来吗?应该说也能写出来,那么举个例子来,同学们看到我在这里写个CR2,如果是可变的,同学们是不是前面咱们要加一个me table,能理解吗?MU是不是要加进去?点这方加进去过后呢,这边会标红,因为我们没有引爆,那这个是MU,你后面这些是不是都应该改一下。啊改,然后这个地方我们就可以怎样加了呢,是不是你这加完了过后,是不是整个这个等号就可以这样子,是不是更更OK一点,好这边我们又没有引包,然后直接给它引一下,诶这个是怎么只能这样子啊。
18:09
Control。引入这个包可变的。好,是不是代码就没毛病了,那么没毛病这个有什么好处呢?因为这个是可变的,我们每次返回的就是它本身,如果是本身的话,其实我们可以这样调用了。大家理解一下啊,注意听讲。好,现在呢,我们使用可变的麦,完成效率更高。诶,效率更高。为为什么效率更高?因为我们没有必要假设你在你这么多次,其实我反复的就会在底层不停的改变地址,这效效率肯定会低,那这样我怎么用呢?好老规矩,第一步先创建,先创建一个可变的map以供使用,作为什么呢?作为左折叠的第一个参数。哎,作为作为左。
19:01
左折叠左啊,左折叠的第一个参数好,这个对我们来说很简单,那我就写一个啊,比如说Val,我写个MAP3等于,这个对于我们来说应该很easy很easy,那就把它放过去包一个就OK了。这是我们这这个就是一个可变的啊各位朋友,那么它是一个可变的话呢,我们再来玩一把,就是深式点。A Ford left,我直接把MAP3传进去。看到没有点仍然是呃不不点啊,直接传入我们这个插count。好代码就写完诶。啊,这是二对对对,别别搞错了,二好,我问大家一个问题,现在我还有必要去接收这个值吗?其实这个MAP3是不是已经有值了,你如果是,如果你这个是不可变呢,你发现拿不到东西,这个MAP3呢,其实它已经就是我们这个结果了,因为你整个过程是针对这一个边,这一个对象来操作的吧,不管你是左折叠还是怎么样,只是它一个,因此呢,这个MAP3我们输出一下这个结果,看看它是不是已经有东西了,来同学们请看运行的效果。
20:19
同学们请看运行效果,我们运行过后呢,发现跟我们执行的是一样的,只是顺序发生变化了,为什么?因为它是可变的,我们讲过map的可变map呢,它是无序的,对不对?好,这就是我们讲的两种方式,大家要好好的理解一下啊,代码很少。但是呢,还是要大家好好理解的,你看我们原先如如果这段代码。放在Java里面让你去统计,其实还是还是挺麻烦的,你还得写好些东西呢。结果现在我们只用了。一句话搞定。对吧,肯定很高效,而且这边呢,嗯,看起来效果也是非常不错的,好同学们,那关于这个第二个题的这个评讲呢,老师就讲到这里,大家下去好好的理解啊,好,最后再来一个题,这个题我先做一个课后练习布置给大家,这题要求要比较难一点。
21:19
难一点呢,就是它是大数据中一个经典的word count的案例,什么意思呢?说给你一个list的。二历史里面很多做算要求使用映射集合统计各个单词出现的次数。就是各个单词出现的次数。其实前面我们已经。已经可以统计了,各单词统计次数,我其实已经可以统计了,但是呢,我要求同学们干什么呢?还要按照次数排序,这个查查。你也应该马上想到集合里面一定有类似so的方法,你给我查一下,就它的流程是这样子,先干一件事情,调一函数干一件事情,再去干一件事情,再干一件事情。好同学们,这个要动脑筋去想啊,这个呢,我们作为一个课后练习交给大家去完成,我到时候再公布答案,好,再公布答案,好同学们,那关于集合综合练习呢,我一共讲了大卖大概这么几个,好,我把它进行一个简单的板述。
22:17
好,我们来走一个课堂练习一的答案,呃,这个评讲呢,就是这个,呃,不是这个是吧,是这个。哎,这是奥buffer的一个使用,我把它给同学们板述到这里,这是第一个题。啊,非常简单,然后第一题讲完以后呢,我有给同学们讲了第二个题,第二个题里面有个Java的实现,我没有去运行,只大家说了一下啊,这个是课堂练习二,这是Java的实现,也给大家阐述到这里。这是课堂练习二的一个说明,对吧,那这边呢,我首先给大家说一下Java如何实现。啊,Java做实现,那么我把Java实现的代码呢,还是给各位朋友放到这,这些代码肯定能跑起来啊,有兴趣的同学你愿意去跑你就跑一下。
23:06
啊,这个讲完了以后呢,我们又讲了课堂练习二,使用SC的方式来折叠实现,我讲了两种方式,一种是可变的map,一种是不可变的map,我都讲了。哎,我都讲了好,这样用scan来实现把这个代码,那我把代码直接给同学们放到笔记中哪里呢?哎,这个第三个点。好,我给大家板书到这里来。OK,好,最后呢,我留了一个课后作业,就是一个经典的大数据的这个题,留给同学们思考啊,呃,如果说在没有老师提示下呢,同学们能做出来,那就特别特别的好啊,当然你要实在做不出来呢,你放到那老师评讲也是可以的哈,这个呢,作为课后练习。课后练习好同学们,那关于集合的综合应用案例呢,我们就先给大家讲到这里。
我来说两句