00:00
同学们,你们以为我们这就完了吗?记住,我们这里还没有完,为什么?因为对于我们来讲啊,我们说了咱们要提高性能,我们希望完美的完成,那么完美的完成当中,那你说这里还会有沙Le啊,对不对?那么只要你有沙Le,是不是就会性能变低啊?所以啊,我能不能够在没有杀的情况下也能实现同样的功能呢?诶,我们说是可以的,比方说这个reduce key会有和会有沙Le,那如果我没有这个reduce key,其实是不是就可以提高性能了,而我们之前讲过的一个知识点恰恰是可以做到的,所以我们接下来给大家用第四种方式来实现这个功能啊来我们的主要目的是为了给大家开阔思路,让大家用不同的思路来理解这样的需求啊,以后可以用很多种不同的方式来做这个事情啊来我们点击OK,嗯,好,把这个放过来,那我们说了,我们这里依然会有杀Le操作,那么我们不想有怎么办?我们有一个叫累加器。
01:05
那么我们的累加器应该是可以实现我们这样的功能的,对不对,为什么呢?它不需要沙错呀,只要挨个变力就可可以了呀,所以说大家看一下在咱们这个地方呀,我就写上干嘛呢,叫做class,咱们在这写上啊,咱们叫hot cata GR,我们的GR啊,然后呢,我们叫做IQ。好了啊,然后呢,我们这么写,这里我们写上啊来,我们叫做咱们叫做自定义啊,咱们的雷加气,嗯,好,首先第一个大家还有印象吗?我要做什么事情,我的自定义累加器,我们是不是应该去继承?哎,咱们有个叫IQ,我们的ma啊来ma,嗯,我们叫VR啊没错吧,然后呢,我们要定义它的泛型,对吗?诶,所以啊,把这些基本的步骤先准备好,第一个我们要继承啊,咱们的继承aqumulator VR,然后不要忘记咱们要定义它的泛译型啊,定义泛型,嗯。
02:14
好了,那定义泛型的话,那咱们这有一个叫做in呢,有一个叫做out呀,哎,所以写上一个in,然后呢,写上一个咱们叫做out,那这个in啥意思,它表述的是从外部传递到累加器当中的值,对不对,它叫输入值,那你准备把每个数据你怎么传进来啊,记住啊,咱们这里呢,是原始数据,它的每一行是一个我们的什么行为,那就有可能是点击,有可能是下单,有可能是支付吧,所以这个是不确定的啊。那这个不确定的话,那其实还有什么,就是那个cid品类ID,就是你的每一条数据,你得告诉我是哪个品类,这个不确定嘛,还有一个你的行为它不确定对不对,所以啊,就是你得告诉我,那么也就意味着在这个地方,你最起码得给我两个值,第一个就是我们的品类ID,第二个是什么,就是我的行为类型啊,咱们写上叫行为类型,你做的什么操作,你是点击啊,是下单呢,还是支付啊,这个事儿你得告诉我,那么我们的out,你最后想返回什么?
03:19
你最后累加气,累加计,你想返回的不就是累加的结果吗?那么你累加的结果大家想想,其实就是我们之前的什么结果呀,是不是就是我们的这种结果呀,对不对,就是它,但是呀,我们如果用这样的东西啊,会感觉啊有点太乱了,所以呢,我们给大家封装一个类啊,咱们写上咱们叫case,咱们叫class,咱们就叫hot category,诶,咱们这么写,那么里面包含什么呢?里面就包含我们的这个叫cid啊,咱们写上一个int,再包含一个叫C,哎,咱们别写int,应该叫字数串吧,嗯,OK,再来一个,咱们叫c count,给它来一个啊,咱们写上一个int,还有一个咱们叫做order countt,给他一个int,再来一个啊,咱们这里呢,叫做pay。
04:08
Count,嗯,Count,然后再来一个int,诶这就够了,所以啊,我们希望的是什么呢?就是我们的里面会有这个东西,就是某一个品类,它的点击数量啊,它的订下单数量啊,它的支付数量啊,我们都希望有,对不对,所以啊,那我们现在就有个问题了,什么呢?你得有多个呀,你得有多个这个对于多个品类ID嘛,那所以多个的话就应该形成一个我们的什么集合,那这个集合为了啊统计方便,那肯定要靠品类ID来统计啊,所以啊,我们应该这么写叫muable。点map,然后里面干嘛呢,叫做string,这个string呢,就是品类ID,然后干嘛呢,放过来,这样的话我可以通过品类ID直接得到这个对象,然后对它里面的值做更新,对不对,我们希望达到一个这样的目的啊好,那我现在呢,就把这个写上,第一个它应该是一个我们的tale,那么写上一个string,第二个写上一个string,然后呢,接下来我们再写上一个叫做muable,诶直接拷贝是不是就可以了。
05:10
咱们直接拷贝,拷贝以后放到这里,哎,这个muable呢,给它来倒一下。好了,那你这么写完了以后,我们接下来该重写它的方法了,大家有没有印象它的方法重写几个,咱们叫重写方法,是不是有六个呀?同学们,这个咱们之前讲过了吧,哎,它有六个啊,那行,接下来我们重写它的方法,哎,六个方法,六个方法当中,我们首先第一个啊,你要记住我输出的是这个样子的,所以我们来拷贝在我的这个地方呢,我觉得准备好叫private,嗯嗯,我们写上叫做v al啊,咱们A,嗯,VVRV也行吧,咱们叫做map啊,嗯,我们写上咱们就叫做hot,诶,Hot green,嗯,Cat就是HC吧,咱们的map吧,等于这么写啊来放过来这么写其实就可以了啊,就这么意思意思啊,然后呢,首先第一个叫it,问你是不是当前的一个初始状态,那我们说了,当这个map里面没有值的。
06:18
之后那就是初始状态对吧?Empty,然后呢,我们这个copy呢,这个copy就太简单了,这个copy呢,我们直接new,把这个呢放过来,诶直接放到这儿来就可以了啊还有呢,就是我们的reset,这个reet呢,把这个东西我们拿过来叫做点,我们叫做clear,诶咱们叫clear啊,那现在呢,这个基本的操作我觉得没问题,咱们之前做过类似的嘛,对不对,接下来呢,往里面添加数据的时候,这个时候你要知道了干嘛呢。我们要从这个map里面看看有没有咱们当前的什么,我们的这个值,这个地方呢,我们可以把这个V啊,咱们加上一个括号,诶诶,别加括号了,咱们自己来取吧,咱们叫做V,点我们的下划线一,那么这个时候呢,我们继起写上啊来,它表述的就是我们的cid啊cid,然后呢,再来,嗯,咱们再来这个呢,表述的是我们的行为类型叫action tap,诶,Tap,然后写成一个下划线二,那现在呢,我就得来了,点叫get我们的什么,我们的all else,然后呢,取这个cid,我看它有还是没有,然后写上一个零,如果没有就是一个零就行了,点VR回车,这嗯,我看看啊。
07:36
好,咱们这个map没有加它这个地方是这样的,那我这还不能给零了,为什么呢?因为这个地方是这样子的,所以我们这里拷贝一下,把这个呢来放过来,我们这写上叫cid,然后呢,写个零逗号,零逗号零,哎,咱们这么来写啊,那这个地方呢,我们应该给它再重新来啊,点va回车,回车以后这个是我当前的category啊,如果你从来没有出现过,我就给你一个新的值就可以了啊就是这个意思,好了,那我这个category我得判断了呀,我判断什么呀,If啊,如果你的行为记住啊,咱们行为就分三种嘛,为什么呢?第四种那个搜索咱们这是不需要的嘛,所以如果你是我们的click啊,咱们的点击拿好了。
08:21
那这个点击是不是应该点点什么呀,它的c count应该加等一呀,对不对,哎,应该是这样子的啊呃,但是你的这个地方有问题,问题在哪了呢?我们的这个可count啊,同学们看在咱们这个地方是一个我们的参数,所以啊,为了让它能够发生改变,我们这里写上个VAR,诶,让它可以改,所以呢,我们这个地方呢,给它加等一就是这样啊,那好,我们的else if,那么如果你的这个它咱们拷贝不是我们的哎,Li,那么你就有可能是我们的什么order,那如果是order的话,那么你的order的数量应该加一呀,所以这个地方应该是我们的order应该是它啊。
09:07
好,再来我们写上叫else if,然后放过来,然后这个地方我们再来,它就可能是一个什么我们的pay啊,咱们的pay,那如果是pay的情况下,应该是另外的一个数量加一了,咱们写上啊,咱们叫payment,叫做pay,嗯,好了,那你这么写完以后,这个对象的已经被我改过了吧,那咱们得更新一下,所以来把这个地方给它更新一下,叫update,然后把这个CAD拿过来,再把我们这个值给他拿过来啊,咱们放到这里就可以了,这样的话呢,我们增加数据就应该是OK的。那好,最下面有一个叫做value,就是返回结果,那返回的就是它呀,所以直接放过来,那好,那现在就剩下一个我们的墨子了,就是它了啊来把这个放过来,嗯。那么墨子的话说的简单点,其实还是两个map之间的合并嘛,对不对,同学们,所以咱们现在来跟我们之前讲过的是一样的啊,咱们这里写上咱们叫MAP1,咱们叫MAP1,它等于我们this,点我们的map,还有咱们的MAP2等于我们的other,咱们的other点我们的value。
10:21
好了,现在两个map有了,那我现在拿我们的第二个map map2点我们的for it,嗯,那么这个for it的话,它里面我们写上K,那这个时候你会发现它里面是什么东西啊,它里面就是cid,再加上咱们那个HC就是那个对象,嗯。然后呢,我们放过来啊放过来,然后呢,这个地方大家看,首先我们需要判断一下这个MAP1,它里面的这个点点什么呢?我们的get or else,我看能不能取到这个cid,如果取不到怎么办?那取不到还说啥呢,那不就是拿我们的这个嘛,对不对,就拿它一个全新的,所以拷贝,所以啊给他放过来。
11:03
好了,那我这个地方点一下,咱们叫VAR,记住啊,这是我当前的,这是我当前的那个对象,这是我们HC,是我们后来的other的,那么他们两个如果现在都有的情况下该怎么办,是不是数量相加了,所以啊,咱们的这个地方来它的点Li countt加等我们HC,咱们点我叫count,嗯,好了,那这个呢,应该是我们的order count,那我们的order count应该放过来,这个应该是我们的pay count啊,应该是我们的pay count,好了,那这么写完以后,大家想想是不是我们更新一下就完事了呢?所以来我们写上点啊,我们这里给它来我们的put,或者哎,咱们直接put吧,Put以后把咱们的cid拿过来,然后再来一个啊,或者说叫update吧,比较put了,叫update,把这个呢放过去,好,更新完成以后,大家会发现这样的话呢,两个map不就合并好了吗,合并。
12:04
那好了以后,那么我们现在的这个累加器就算是做完了,那么你做完了以后,大家想想咱们的这个代码当中,你就会发现我们有些地方需要改一下了,这个咱们就不要了,把这个去掉,去掉以后这个咱们其实也不需要了,为什么呢?因为我们只要用累加器就可以了,所以这个地方我写上一个叫什么呢?叫for it。咱们写上叫for it,嗯,好,然后我在上面我们声明累加七,咱们叫ACC,它等于SC点,我们叫做什么呢?嗯,诶咱们叫做registerist啊,那这个我觉得是不是应该是这样的,咱们在上面呀,咱们写个new new了以后把这个我们拿过来啊,放哪去了,在这。拷贝一下,嗯,在这个位置给它复制,复制以后,那我现在把它放进去,然后起个名啊来。给它来起个名啊,这个名称就叫hot cata GR,诶就是这样的啊,OK,那我的累加器现在已经准备好了,准备好以后就用一下呗,所以拷贝记住这个时候点击的场合,你就不要这么干了啊,咱们来,咱们写上点,点了以后干嘛呢?叫ADD,然后ADD的时候我写上,嗯,咱们写个括号啊,写个括号第一个叫做什么呢?诶叫做我们的date是写上一个六,然后再加上一个叫做C,因为你这一回是点击,那好我们再来往下,那这个时候呢,一个道理啊,同学们来把这个去掉,呃,这个地方我们就去掉了,我们写上叫acc.at嗯,At那这个地方,诶我看看啊,咱们这其实都不需要map了吧,咱们这for it是不是就行了,所以啊,咱们IDs.for it for it的话,ID,然后放过来,放过来以后acc.a嗯,然后呢,括号叫做ID,然后写上叫order。
13:59
没错吧,就是下单这个就不需要了啊呃,同样道理,下面是完全一样的,所以拷贝拷贝以后把这个呢我们去掉,嗯,这个呢,应该是我们的这个叫做配诶好了,同学们当诶这个其实就不需要了啊,不需要这个东西了,嗯。
14:16
当我们循环遍历完成之后,其实累加器的值就有了,所以拷贝过来啊,我们在下面这个地方,这个我们暂时啊就都不要了啊,把这个都去掉吧,嗯,去掉以后点我们叫做value,点一下,嗯,咱们叫VAR回车,你拿到的其实是什么?同学们想想哎,咱们看看啊,我现在拿到的就是result。啊,其实不能叫吧,就叫一个我们的ACC的一个map吧,或者叫做value,哎,就这么写,累加器的结果,那么这个结果呀,大家想想这个是品类的ID吧,这是它对应的那个点击的对象对不对?但是你会发现这个里面是不是也包含了什么我们的品类吧,所以大家看一下我们这里啊,其实完全可以不需要咱们的这个什么,它只需要一个它就够了,所以在这种情况下来拷贝,拷贝以后点我们叫map,这个map呢,我们这么写叫做下划线,点我们下划线二,我们只需要我们的那个对象就可以了,点一下VR回车,这个时候大家可以看到就是我们的categ GR s多个它,那现在我们的品类ID数量不都有了吗?有了之后你来比较一下不就行了吗?所以啊,咱们来记住啊,咱们下面这个咱们就不要了,去掉。
15:33
去掉以后我们点我们叫做short,诶它没有sort,不能排序,是因为它是可迭代的,它没有办法排序,所以呢,To list点我们叫做sort,这个sort呢,我们想自定义排序,所以我们用这个叫sort with,用它,那么这个sort位置呢,就会什么呢?拿两个值,一个是左边的,一个是右边的,对不对,诶就是这样的,那好了,那我们现在想要的是左边的我们的点击数量,它要大于右边的点击数量,为什么?因为我们是降序,左边大右边小,所以我们写上叫做if啊来,我们写上叫左边的点叫clean count,它应该大于右边的啊来。
16:18
咱们叫右边的c count啊,那这个时候就是你想要的,然后else,我们写上一个force,你想要的不就是左边大右边小吗?所以这就是降序,可是有个特殊情况,当我们的这个地方来,我们写上叫L1,你当这两个相等的时候。如果它相等的情况下怎么办呀,同学们,那是不是应该判断我们那个order了,所以我们的左边的order count,它如果大于右边咱们的,哎,点我们的order。那这样的话呢,我们说也是我想要的,然后呢,Else它就报400,嗯,好,那这个时候还有个特殊情况,就是它俩相等怎么办?所以再来一个l if啊。
17:07
如果它们两个我们要相等了,如果相等的情况下,那么这个时候同学们看我们应该怎么办呢?其实就简单了,我就直接判断那个pay就完事了啊,我们写上一个right,点我们的这个pay account,你这么写完以后,那么其实最终就已经排完序了,所以咱们叫salt啊我们的这个操作,嗯,行了,那你这个排完序之后,那还说啥呢,我们直接取就完事了呗,所以呢,我们写上啊,咱们在在这吧,然后写上点我们在这里呢,给它来take,我们取前十个,哎,这就行了啊,OK。好了,同学们,我们现在呢,用累加器的方式给大家把这个功能改善了,加这个地方哪有什么沙Le啊,是不是直接就是一个for意循环呀,对不对。
18:00
所以啊,它的性能呢,就应该比之前要快一些啊好,我们来看一看。好了,同学们,结果出来了,看看对不对啊,往上走往上走以后612061196098没问题吧,跟咱们之前说的也是不是完全一样的,哎,所以这种方式我们就比较不错了,因为它没有沙,性能更好一些啊。
我来说两句