00:00
我们已经实现的这个word countt是一个普通版本,也是最经典版本的word count,那如果我们稍微对这个数据做一些改动的话,那它会变成一个更加复杂的版本啊。接下来我们给大家讲一个复杂版的word count。同样还是你有一个SC的object s18,嗯,目前这个叫com or count法写出来首先还是先要定义数据,之前我们定义的是一个string类型的list,那复杂版本会复杂到哪里呢?诶,主要这个它会复杂的程度就是我们会把每一个出现的string。跟上一个它已经统计出来的频次啊,这跟我们最后想要统计的那个world com的形式是一致的啊,就是最后得到的不再是一个string类型的list,而是一个本来就是一个二元组string in2元组一个list啊,所以这里边我们一定的啊,Hello可能出现了一次,哎,那么后面hello word。
01:18
他可能出现了两次,那下面hello skyla见了三次,说明我们前面已经做了一个预统计了啊,有一些这个。组词构成的一句话出现的个数我们已经统计出来了,是呢,我们接下来要把它进一步的拆开,统计出每个词得出现多少次,哎,所以这个就相对来讲会麻烦一点。后面这个我们再来一个二,那对于这样一个。List之前的数据已经做了一个预统计,那想要按照我们之前的标准再把它完全拆开,得到每一个单词对应的个数,然后再做一个排序输出,怎么样实现这个功能呢?
02:07
啊,那首先我们能想到有一个最简单的想法,那就是我们可以先把它完全展开嘛。哎,比方说当前的这个想要展开我们的一个思路啊,思路一直接展开为。普通版本,因为当前既然它有已经存在的这个个数,那大家想我直接把当前这个hello word重复好几个hello word出来,那不就是相当于展开成了我们那个普通版本的一个例子吗?呃,然后最终再把它完全合在一起,打散之后合在一起就完事了啊,所以接下来我们这个思路还是非常的简单,呃,那我们就先要得到一个new list是当前的这个个数,已经统计好的个数,直接在展开基于之前的list。
03:06
做一个map操作,这个其实非常容易想到里边传的这个操作呢,当前里边的其实这已经不不是string list的了啊,或者我们把这个直接叫做一个list吧啊,因为当前其实已经是元组的一个list了啊,里边的每一个元素当然就是一个value,对了,我们把它叫做KV,那里边要做的操作,我们能想到的要做的操作,那就是。把它完全展开,最后得到一个我们之前处理过的string类型的list,哎,这是能够想到的最简单的思路,那这里面要完全展开的话,其实也很简单,就是当前我们要想展开的东西不就是KV2大划线一吗?就是当前这一个。
04:00
五串吗,然后。它需要的这个展开之后的重复的次数,不就是AV点下划线二后边的个数吗?那直接我们之前不是讲过字符串可以有一个乘法和这个复制。复制的拼接吗?啊,那直接乘起来就完事了,但这里大家要注意,直接这么乘的话,Hello word后边word和下一个哈,就直接连在一起了啊这个就有问题,所以我们这里呢,可以直接在四呃,KV点下划线一后边加一个空格。但为了防止前面A点下划线一还有别的空白符,我们可以直接做一个tri,然后再把它做这样的一个,加上空格,再去乘以个数这样一个操作得到这个东西之后,我们可以先看一眼这个new string的。你长什么样?我们看到现在得到的东西,那就是。
05:03
所有的单词,诶,就是相当于就变成了我们普通版本一开始输入的那个状态了,那接下来要做的操作那就完全一样了嘛,先扁平映射,先打散,然后按照word做一个分组,呃,后面那就是统计分组之后每一个例子的里边的长度,统计次个数后再转成一个list,再做排序,然后再取前三就完事了啊那所以接下来就是接下来操作与普通版本完全一致。啊,那我们这里边就直接连在一起,直接输出了,我们写一个word count list,最终想要的是list里边是一个二元组string,基于之前的new string list去做操作,我们这里边就用这种点点点的链式调用,步一步把它都写出来。首先是一步let map里边传入的当然是要做SP分割了,按照空格去做一个分词,直接写空格分词,然后接下来要做的这个操作。
06:31
下一步那就是分组了的话,还是以每个单词为准嘛,所以就是word,然后一取word作为当前的K,按照N词分组。啊,那接下来当然就是进一步去做一个map操作了,把每一个组里边的那个list统计出它的个数来,哎,那我们当时做的不就是每一个KV转换成一个W,对啊,目前的这个KV。
07:11
看的下划线1WORD还是word,而后面的对应的那个list呢,直接取它的less啊,当然大家如果要是想取size也是一样的啊,举例子来讲,呃,这两个都是一样的。最后。是budist,然后再去。Thought by啊,或者thoughtt with,那我们用了thought with,现在我们用一个thought by吧,Thought by大家知道,首先定义的是当前以哪个字段为排序的标准,那是下划线,二是我们当前统计出来的那个个数,前面这个统计出的统计出每个N次的个数,这里以这个个数为一个排序的基准。当然了,还需要传入当前的顺序,那就是ordering reverse啊,这样的话就是从大到小排列,最后你做一个去前三的操作,就整体来讲,这个跟前面是完全一样,作为一个复习。
08:18
我们再重复一遍。Work list直接做一个打印输出,我们可以看一看得到的结果,这里少了一个括号,你看得到结果是什么样的。哦,我们现在的前三名出现的这个频次明显就高多了,看到hello有九个,SKY6个,From是三个,哎,这就是对于复杂版本的一个最简单的实现思路。讲的是我们会发现这种方法其实不够高效,因为本来我们之前在这个数据里边已经把当前字符串出现的次数统计过一遍了,结果呢,我们是把它又完全展开,又把这个相当于统计。
09:07
全部倒回去,最后再打散,完整的再做一遍统计,显然把之前的统计工作就相当于都给埋没掉了,哎,那我们能不能用更好的方法把之前的统计利用上,直接把它转换过来呢?哎,这个其实也是可以的,所以接下来我们再介绍另外一种思路。思路二就是直接低于。预统计的结果,之前那个我们叫预统计。预先已经统计好的一些东西啊,预统计的结果进行转换啊,那当前的话,我们就还是基莫list去做一个对应的处理啊,首先我们应该基于莫list,然后啊,它当前所有的数据先做一个展开啊,就是对应的,我们会想到就是每一个当前已经有的这个每一个数据啊,我们其实是想把这里边的第一个,就是当前元组的第一个元素做一个。
10:21
按照空格做一个切分,然后切分开了之后呢,我们可以把每一个。对应的单词跟后边,因为它每一个单词都会出现后边这个次数嘛,跟后边的这个数字再合并成一个元组,每一个单词都跟后面这个拆分成一个元组,最后得到的其实就是这样一个元组的。对应的一个数组啊,那最后呢,我们肯定要把这个元组的数组构成的list再来直接打散,所以整体来讲,我们这就是把所有的元组按照单词拆开又打散的一个过程啊,那这里我可以直接把这个对应的内容写出来啊,我们就把这个叫做precon list,我们想要得到的是一个什么类型呢?哎,那就是这一个list里边的所有元素,还是string in,不过之前我们一开始的这个string in,每个string是一堆单词,我们打散之后呢,就是拆开的每一个单词,然后跟着它对应的这个个数了。好,那接下来我们看一下具体怎么实现,这听起来还是有点复杂啊,我们看一下具体的操作吧,Sample list。
11:38
我们要做的是先把它切开,然后转换成对应的那个二元组,再呃,相当于我们那个是变成了一个嵌套的list,最后还要打散,一听到这样的操作,那明显这就是一个Fla map嘛,A map里边我们就可以直接把一个操作搞定了,那当前我们要传的这个操作呢,稍微有点复杂啊,因为当前我们已经拿到的是一个元组,我们是要把这个元组里边的数据,首先就是先把当前的string先拆分开啊,比方说我们这个就叫做strings啊,我们知道拆开之后的类型其实是string类型的一个array,一个数组是利用temp到它,我们要使用它的大划线一,注意当前还是一个元组类型,大划线一还是我们要拆。
12:38
分要切开的那个string,所以对它做一个lit要用按照空格做一个切分啊,那得到的结果当然就是一个string类型的array了。那这样一个array,最后呢,我们还要把它再做一个转换,因为我们不是要把这个string最后打散,我们是要把这个string再包上后边我们的那个个数。
13:03
包成二元组,再把它打散啊,那所以最后我们真正要返回的一个二元组,所以是strings,还要再做一个map操作,因为它本来是集合类型嘛,我们可以让它转换一下里边的每一个元素,我们拆拆开之后,其实是一个word,现在要把这个word变成一个二元组word,以及那它的count应该是多少呢?其实就是我们原始的这个temple里边的第二个那个count值,直接把temple点划线拿过来,这样的话就到了我们想要的这个东西。稍微的有一点绕啊,那这里我们还是打印出来看一下当前的这个值是什么样子。Free,我们看一看,呃,跟上边我们还是做一个。还有一个分割线。
14:00
运行一下。我们看到当前得到的结果就是,哎,我们一开始不是有这个一个hello,后面是hello word吗?Hello word两次我这里拆开就是HELLO2WORD2。然后后边呢,Hello skyla3次,那就是哈3SKYLA3就把这个完全拆成这么多个。二元组的一个列表了,哎,这样的话就是达到了我们想要的这样的一个目的啊,啊,当前我们就是想要得到这样的一个东西,接下来呢,呃,那当然就是基于这个所有的二元组再做一个分组,那我们根据的是每个二元组的第一个这个word单词做一个分组,分完了之后,哎,那大家知道每一个组里边呢,那就是所有的二元组都放在里边了,那就是HELLO1 hello2,还有后面HELLO3 hello1这些都会放在同一个哈组里边,我们再把对应的那个个数统计出来相加,呃,就是我们当前的整个哈的计数值,哎,所以我们的思路就已经这样清晰出来了,下来。
15:08
我们把这个还是单独的写出来啊,第第一步做的操作是将。字符串。R散为恩慈,In。结合对应的个数包装成元组啊,那这是第一步,然后接下来的第二步我们要做的事情是。对二元组进行按照单词进行分组就是比较容易想到的,那我们这里得到的应该就是一个。
16:01
Pre map这边我们直接用前面的pre list直接调一个group方法,里边要传入的就是确定我们当前的K到底是谁,前的K不就是每个元素的第一个这个字段吗?啊,第一个值,第一个属性吗?所以当然就是。我们这个当前某二元组里边的下划线一,那这个简写的话,其实没必要这么麻烦,我们直接写一个大划线点划线一也就够了啊,直接把这个拿到。每一步,为了让大家看的清楚,我们还是把它做一个打印输出。来看现在转变成了什么样子。大家看到,呃,这里我们要打印输出的是pre map。的类型,如果要完整的写出来的话,应该是一个map类型,里边具体的B是一个string,当前的word,那值呢,只是一个呃,List后里边的每一个元素就是我们原始的这个k value,对,就是二元组string in啊,所以得到应该是这样一个类型啊,运行一下。
17:19
好,这里我们少了一个括号。重新运行一下。看到得到的就是,哎,Word这一组里边是list word2啊,只有这么一一个统计啊,那么flink这一组呢,里边只有一个弗LINK2,那么后边我们看到s scla组这里边就有SCLA3 scla1 scla2,所有的这个之前我们这个元组啊,出现SC的元组都放在这个例子里了,那同样from这里面有两个FROM1FROM2哈。当然是比较多的啊,这是应该是最多的一个,那所以我们接下来要干的其实就是把每个list里边的对应的第二个元素的值要做一个叠加。
18:04
这个比之前就稍微麻烦了一点,之前我们只要统计list里边的个数就可以了,现在呢,是要把每一个。元素的第二个字段进行叠加,哎,那接下来我们看第三步就是。叠加每个单词。预统计。啊格数值啊,那对应的我们接下来要得到的其实就是一个count map了,我们能想到直接基于之前的预统计map可以做一个简单的转换,哎,做一个map应该就能转换成我们想要的东西,但是我们这里边map大家会发现,呃,就是其实我们当前的这个key是不变的,只是想改变它的这个value,把这个改变成诶里边这个值的叠加不就完了吗?哎,那这个有有一个更加简单的操作啊,就是报再去map了,因为它的那个。
19:10
这是完全不变的嘛,我们当前就直接去来看下面有一个map values,直接把当前的value全部更新就可以了,而里边传进来的这个函数要操作的呢,就是要操作的对象就是这里边的每一个value,那这里边每一个value其实是我们的这个元组的一个list,对吧?啊,当前我们的这个。List,那么对于每一个temple list品牌,我们其实要做的操作是这list啊,首先我们应该把前面的这个word都都去掉啊,大家看到就是比方说我们后面这个hello,这么多这个哈,这个都没用,那我们知道当前它的K都是哈嘛,把这个都去掉,也就是把每一个元素由二元组类型转换成一个int,就只要取它的后面这个值就完了嘛,所以首先我们要做的操作就是。
20:11
Temp list直接r map map成,呃,这个map操作的话,其实就是直接取它的下划线二,它的第二个元素取出来之后呢,当前的list就变成了,比方说这个哈,就变成了LIST12312,那接下来干什么呢?当然就是直接做一个大,直接把这个数加起来不就搞定了吗?啊,那所以接下来我们得到这个count mapp,它对应的类型不应该是啊,Map之前的T不变,还是string,所以我们调用的这个方法就是直接map values根本改我们之前的那个,而最后得到的对应的那个value呢,已经由之前的这么一串一长串这个list变成了一个值聚合散出来的一个值。
21:07
那接下来我们看一下得到的map到底长什么样?大家看到这个已经非常接近我们最后想要的结果了啊,那已经把所有的k value都已经统计出来,那最后我们要的不就是啊,接下来就是转换成list排序,然后输出你三吗?转换成list排序去N3,那这个过程就非常简单了啊,跟之前我们要做的那个操作就一样了,我们叫list低于map,首先要一个list的方法,然后接下来我们可以做一个out with,用下划线二因为降序排排列,所以是。
22:02
于号,这样的话就是按照第二个字段上去直接做一个排列,最后三我们把最后得到的结果count list打印出来,看看跟之前的这个结果是否一致。我们看到完全一样,哈,9SKYLA6FROM3,这是我们统计输出的前三名啊,这种实现可能稍微会有点复杂,但是效率会更高,希望大家可以把这两种方法都练习熟练。
我来说两句