00:00
好,那么关于集合这一章的话呢,我们相关的这个接口及实现类呢,就告一段落了,最后这块呢,我们再讲一个工具类啊,这个工具类呢,叫做collections。前面的话呢,我们讲数组的时候呢,最后也讲了叫aris,然后呢,我们这个collections呢,就类似于这个aris啊,回到我们这个课件这块看一下,除了参考操作数组的这个工具类呢,叫ari,那么collections是一个操作list啊,Set和map等集合的工具类。哎,这个呢,一句话呢,就把当前这个类的作用呢,就说的很清楚了,这里边儿我们要能看到啊,它不光能够用来操作collection。啊,因为它是在collection的这个基础上加了个S,它呢还包括操作Mac的map的这个方法。啊,这个大家一定要注意一下啊,哎,那把这句话呢,我们粘过来,这句话呢,粘过来之后呢,其实我们关于这样的一道面试题呢,基本上大家就也会答了。啊,你看这俩长得又挺像的。说区分一下和这个怎么说。
01:02
对,这是个接口,那你不能一一句话就结束了接口俩字啊。具体来讲。对,我说这collection呢,是我们讲这个集合框架当中用于存储一个一个元素的一个接口。是吧,具体的话呢,又分成list和SET2个子接口。啊,这个我们说一下啊,这那这个集合框架中的啊,用于存储一个一个。啊,元素的这个接口是吧,然后呢,又分为。啊又哎,分为比如说叫list和set等子接口。哎子接口啊,哎,这呢,就我们说呢,它是一个容器啊,因为存储一个个元素的一个接口,或者叫一个容器了。啊,这是一个接口的概念,而这个collections这个怎么说呀。
02:00
对这块呢,其实上面写的已经很清楚了啊,就是用于操作这个集合框架当中各个集合的一个工具类啊。呃,用于操作啊,集合啊类的一个啊,或者叫集合框架。的一个工具类啊,那么此时的这个集合框架。哎,包括涉及到了,比如说有set是吧,有这个list,哎,注意还有这个map。OK就可以了,行,这个呢比较简单啊,大家能够说清楚,呃,然后呢,我们提到这个工具类的话呢,那基本上也就是讲一下它里边常用的这个方法呢,看都有哪些了,这呢咱们就直接来看一下这个课件了,那既然这个工具类呢,其中的这个方法呢,基本上就都是static了,所以这块呢,我列举出来了一些方法,当然呢,大家如果看一下这个API文档的话呢,这个涉及到的方法呢会更多一些,我这儿呢,就把这个方法呢给大家分类分类,我们举其中的一部分。OK啊。好,就到这CTRLC一下。哎,我就直接呢,就粘过来了。
03:01
有点多是吧。哎,稍微的往上提一提啊。行这边的方法的话呢,我们就不一个一个的都给大家去演示了,里边呢有一些呢,大家其实一看这个名字呢,基本上也就建明之义了。嗯,不太好理解的,或者容易呢,大家调用的时候呢,出错的这块我们稍微的说一下啊,行,那首先这块,比如我们就先看一下这个第一波啊,这我们去新建一个,诶当前我们这样的一个测试啊,Collections它的一个测试。好,现在来一个单元测试第一个啊。诶把这个我们粘过来,诶这里边儿的几个方法呢,应该算是比较常用的啊,呃,其实不太难,我们稍微的看一下吧。这呢,我们能看到呢,都是操作这个list的第一个呢,叫反转。第二呢,叫。Shuffle啊,这个呢,就是一个叫随机的一个操作了。嗯,然后下边这个叫sot排序,这个呢,ST的话呢,也是个排序,所以呢,你一看呢,这儿呢,其实就是自然排序了。这个呢,就是对应的叫定日排序。对,然后这个呢,是交换我们这个例子当中指定两个索引位置的元素。
04:04
啊比较清楚行,那这块我们要想演示的话,得先有一个list。嗯,要是比较简单的话呢,我就可以这样了啊A点咱们有一个叫as list是吧。当时咱们讲过这儿呢,我就哎写一些这样的一些数据了。这其实我放的都是对吧。嗯,这样就自动装箱了啊好,然后呢,Alt加一个回车这块我们就得到一个具体的例子了,这我们看到呢,这有一个泛型,咱们先把它呢先干掉啊。好,这是我们的一个例子了。接下来我们通过这个S。哎,通过它呢,我们先调,比如第一个啊叫reverse。把我们这个例子呢往这一扔。啊,这个呢,我们先这个提前呢,先调一下这是本来的这个啊,然后这个呢,我们是演示一下这个reverse的一个执行。很OK啊,那完了以后呢,我们再去打印一下当前这个例子,看一下是不是反转了,走起。嗯,好,那这块呢,就到这来了啊,所以这块呢,如果你需要啊,去反转的话呢,不用我们自己去写了,直接呢,你调这个方法呢就可以啊,这个我就把它注释了,接着呢,我们来看下边这个,这个呢叫随机的一个排列。
05:13
哎,就他啊,嗯,还是这个方法。哎,粘过来,我把这个呢,给它稍微的替换一下啊,杀否是吧,这个就是随机化的意思了。你看执行这时候的话,你看到呢,跟我们一开始一个顺序呢,就不一样了啊,56 43 45我们再跑一次。你看你看这时候这个顺序又不一样,这就算是一个,哎,随机混乱的给你这个。变一下这个顺序啊,有点像那个扑克牌的时候呢,就是洗一下牌。那就这个过程啊。好,然后下边这呢叫salt方法,那既然呢,我们涉及到salt叫排序了,那其实这块有一个要求了,就是你list里边放的多个元素呢,是不是得是同一个类型的了。那要不大家也没法去比较谁大谁小了啊,所以这呢,我恰好放在都是了呢,它本身呢也呃实现了comparable这个接口,所以呢能使用这个自然排序。
06:03
所以这块我们这么着啊,S排序CTRLC。哎,我就还在这块来写吧,这么着一下。哎,把这个呢,哎,我们先注释一下,哎拿过来。哎,我们这呢,就扫一下啊,好接着再执行。哎,大家看这时候的话呢,我们就按照你这个默认的这种integer实现comparable的这个方式,其实呢,就是一个升序来排了。OK,那就这样个情况好,那如果说我不想按照这个升序排,我就想降序排。那你只能是定制了。哎,也是用我们下边这个方式的。哎,就好啊好,那这块呢,我们再把他那注释一下拿后来,那如果你要想降序排的话呢,你得自己呢,是不是填一个competitor是吧。哎,那这块呢,逗号一下,我们来一个匿名的实现类的匿名对象吧,诶new一个comp,那我就,诶这块呢,我们就不写了先啊。好在这里边CTRL按一下,把我们这个compare to这个方法呢,我们做一个重写。
07:03
那就在这写了啊,那这时候你要清楚一下,我们当前这个object呢,现在是谁比较的是谁。诶,是不是我们当前的这个里边的元素,实际上呢,应该是integer是吧,OK啊,所以这块我们要判断啊,说如果OE啊,In of integer。并且啊,O2呢,也得啊这个啊。哎,都是我们这个英特尔这个实力呢,接着呢做强转。啊,这O1啊复制一份。哎,这么着了啊行,然后呢,下边呢,我们要比较一下它们俩的这个大小。这个大小是咋比啊?嗯,这个应该是这时候叫I1I2了是吧,正常来的话呢,有同学说我直接就I1减I2,其实这样写的话呢,倒是也问题不大是吧。给称一下啊,所以这里边呢,涉及到的点呢,就是两个对象,既然能做减法,实际上这块呢,是不是就拆箱了。对拆想了哈,诶,其实呢,我们也可以考虑呢,就是主动的你把它这个对象获取它对应的这个int型的这个值。
08:04
也可以是吧,还记得当时咋做过。A,一点儿。是不是叫一个int value啊。哎,这样就获取它这个本身的这个int型的值了啊,你再减去二二点叫int value也行是吧。诶,我们这块呢,去return一下,就是这样写的话呢,就自动的有个拆箱,你要不呢,就自己主动的去给他获取一下这个值也行,这呢前提呢是你是一个呃的时候,这样的话呢,其实还是一个升序了,咱们如果想降去的话呢,把它括起来,前面整一个符号,这就可以了,然后这个位置呢,我们来一个肉啊,一个runtime exception。说叫类型不匹配,这么着这就可以了。行,这个完了以后的话呢,我们当前的这个实例呢,我就写好了,接下来呢,我们再去sortt这个例子的时候,只要你传了一个compor,这是我们就按你给的这种方式呢,来进行一个比较大小了,所以这我们再举例子呢,这不就是降虚了吗?
09:00
走起。那这种呢,就到这来了。哎,就这样理解一下啊,好,这个我们就过了,然后呢,下边这个swap呢,就是交换这个例子当中指定这个索引位置啊,比如说索引零索引一把它俩交换一下,这个比较简单,我就不说了啊。接着我们看下边这一波。下边这波的话呢,我们看看哪一个可以测一测啊,Max就是取我们当前这呢是一个collection,当然了我们也可以放个例子了啊,取这里边儿这个最大值。哎,取这个最大值,诶,怎么还差一个competitor是吧。这个看能理解不?哎,这个我稍微的再粘一下啊。这个就放在这儿。哎,这个呢,比如我们把上面这个呢,还是先拿过来啊。CTRLC一下。所以我们叫T2,哎,先这么着一下。好,这呢,我们第二页这叫collections啊。第二这个呢叫max,取最大值,把利往那一扔,它呢就能够获取当前这个集合当中的一个最大值了。
10:03
啊,这个是一个max得到的,嗯。这个他以为我们调的方法不对了啊,我就直接来写object吧。哎,这么着啊。好这呢,它可能有其他的这种方法啊,返回值呢,就写的就不对应了,好这是一个object object了,然后呢,我们打印一下这个max。啊,现在的话呢,我们就能得到这里边儿的一个最大的值,应该是这个65了啊。啊,这就出来了,但你看他怎么还会有一个这样的一个参数去传呢。嗯。这个呢,它其实是这样的哈,你看我们现在呢,要获取它的最大值,怎么叫最大呢?其实我说呀,就相当于这种所谓的自然排序一样,最右边那个就是最大的。是吧,呃,那我们要是取这个最小值呢,其实就是最左边这个就是最小值了。这个大家你再来看哈,我们刚才写的时候呢,咱说呢叫降序排。其实呢,我说呀,对于这个程序来讲呢,他认为还是一个从小到大排。
11:03
只不过呢,是我们让那个正的那个数变成负的了。能理解吧?哎,就是咱们正常来讲呢,其实小的在前边,大的在后边,然后我们这样整的话呢,你不是加了个符号吗。所以程序来讲呢,他认为这个最右边这个其实就是算最大的了。所以这个呢,我们取这个max的时候呢,呃,其实默认的就是取最右边这个,然后呢,如果我们说诶,我想取一个最小的,但是你掉的还是max。咱们这个呢,你就让他这样去拍,还是最右边那个,其实呢,就相当于取了个最小的。我感觉我说了以后不如不说呢。是吧,说完之后呢,这整懵了,当时是吧。这个意思哈,我就把这个说一下得了,确实后悔说了,其实这些点呢,大家可能说这辈子也没用这个方法,结果呢,上课讲的时候给讲懵了是吧。好,这是你刚把这个例子放到这儿,它是不是又得传一个compor是吧?的话呢,咱们就把上面这个吧。
12:00
我CTRLC一下。我给你粘过来,这个OK吧。首先应该能知道这个语法上是没问题的啊。粘过来之后呢,你注意咱们这块呢,是不是让这个降序排列啊。降雨排的时候,把例子放这儿,取一个max,这呢我们来一个object,我叫MAX1,那你觉得我们这个MAX1是多少呢?哎,是还是65吗。你看你会发现呢,他把这个最小二呢给整过来了啊。嗯,它什么意思呢?它其实呢,就相当于是这个呢,我就按照自然排序来了,自然排序完了以后呢,最右边这个就是最大的。然后现在的话,你让我按照这种方式排行,那我就按照你这种方式排。反正排完以后,什么叫最大呢?就是最右边的。哎,那这个呢,咱们里边实际上是个降序,咱自己知道是降序的啊,但是对于这个程序来讲呢,它其实呢,是你这个正的数呢,大的那个数,减小的那个是负的,你非得整个相反数,你把它俩关系给变过来是吧。所以对于我们这个程序来讲呢,就是按照你这种方式排上去以后呢,最大的就是最右边的。
13:05
所以呢,你是降去的,那最后边不就实际上是最小的这个数啊。行,然后这个mean呢。就不说了啊,这个你要清楚了,这个就清楚,这个不清楚了,这个也不清楚。啊,这个就取最左边的是吧。按照你这种方式排了以后呢,最左边的啊,好boundary search取我们这个例子当中,你想找某一个元素啊,找这个元素的话呢,看它是在哪个索引位置上,因为呢,只有list呢才有索引,所以这块我们只能放list,不能放collection啊,像S的话呢,就没有所谓的索引之说,这个呢就是二分法查找效率比较高一些啊。嗯,OK,那二维码查找的时候你要小心一点,这个例子里边元素呢,是不是得有趣啊。啊,没续的话这个就用不了了啊,这个注意一下啊。好,下边这个呢,叫frequency。啊,就是频率的意思啊,判断一下某个元素啊,在当前这个集合当中出现了几次。哎,就是这个意思。
14:00
比如说咱们当前的这个里边,哎,调一下这个collectionency点啊frequency把这个例子往这一放。咱们这里边儿有这个45是吧。哎,往这一放。哎,这个我们就来一个叫count吧。哎,说呢45。出现了。啊,几次是吧。哎,就这个意思,哎,走一下。那在这里边儿呢,45出现了两次。啊,你看这有个45,这有个45,哎,这就可以了啊行这个呢,是我们说的这一波方法。嗯,下边这块呢,有一个copy copy呢就是叫复制的意思啊,这个src呢,这个很自然的就是我们这个叫圆list,就是你想把这个list呢元素呢复制到这个里边,这个death呢叫destination啊,就是目的目标是吧,这样一个意思。这个大家在调的时候呢,可能会出问题。
15:00
哎,看着挺简单的是吧,但是这个呢,容易出错啊。这个我们再写一个。哎,针对于这个方法呢,咱们测试一下。咱们提前呢,先来一个list吧。CTRLC一下。这个例子的话呢,比如说咱们就作为这个叫src了。啊OK行,然后呢,我现在想复制一份啊,咱们第二下点这个叫copy啊。嗯,Copy里边呢,先注意放这个叫desk。这个呢,没有提前造一个,哎,那我们想到的话呢,就是new一个这个a list是吧。然后呢,这呢叫Lisa吧,叫death了,好把这个death呢放这儿,然后src呢放这儿,嗯,想法呢,就是说把这个里边的这些元素呢,就复制到我们这个death里边了,那我们再去打印一下这个death呢里边呢,就希望呢有诶跟你一样的这样的一些元素了啊想法的话呢,是比较直接的,那我们run一下呢。就挂掉了是吧。这个呢,就是大家在调的话呢,可能也容易出错啊,它出错原因呢,说是south does not fit in best。
16:02
SS呢,就指的是我们这个src哈。说他呢不适合这个desk。那就好比是呢,你这个脚不适合你这个鞋是吧。不适合的原因呢,一般都是这个脚大鞋小是吧。这个也类似说S呢,它不适合你这个desk,这个在哪报的呢?首先呢,你看这个异常咱们说过啊,从下往上看。这个呢,就是咱们自己这个方法,相当于是个战针在102是吧,这里边呢,又掉了这个561了,点一下,诶跑到这儿来了,所以这就掉我们这个copy方法了啊。这个方法的话呢,我们把这个代呢,把这个S2C哎都放进来了,它这有一个这样的判断。第二这个判断呢,它就进去了。你看。那咱们回来看一下啊。这个我把他那稍微比如说盯一下。哎,咱们当年这个题目当中,你说我们这个SC的size。
17:04
是不是就得数一下了?四五六七八九十十一个是吧。啊,那你说我们这个带点size是多少。是多少呢?s.size。哎,有的同学说到是十是吧。这个十是啥呀?以前我们稍微提到过,就是说它里边呢,有一个数组的创建是吧,那你这块呢,我们把光标放这也能看得到啊,说呢,它构建了一个空的list,有一个初始化容量是十,相当于我们这个数组的长度呢,是十,那我这块问S是几,如果还说是十,那这个方法就白讲了。啊。这个呢,Size咱们是说里边有几个元素是吧。一个也没有吧?是不是一个也没有嘛,所以这个是零啊。哎,那所以说呢,你上边呢,刚才我们说的是多少11个是吧。上面是一个大于零个,显然呢会跑一场,他的意思就是说呢,你这个呢,你这个size呢,你得比我这个不小,我才能够给你塞进去啊。
18:07
那这个事儿咱们怎么做到呢?啊,有同学说提到这构造器,这写一个数是吧。比如说写个20,显然呢,超过你这个11了,但是你这块注意啊,这个20的话呢,指的是我们现在呢,创建的这个数组。它的长度是20了,这个size呢还是零啊,你看这会儿我们去做一个运行。这不还是零吗?所以这个事儿呢,这样不靠谱儿。啊,还用空的吧,比如说。怎么办呢?你说那那那只能是这么着了,我就先爱先整个闹。然后呢,诶把它撑起来是吧,你看我艾特一下这个是不是就变成一了。脑袋艾特一下就变成二了,呃,为了我要把它装进去,我就艾特十一下,然后呢把它这个撑起来,然后呢,我们就可以呢撞了。这倒是一个办法,但是呢,是不是有点悲壮啊?
19:00
啊,不太靠谱是吧,哎,那这个事儿咱们怎么做呢?哎这个呢,首先咱们说呢,目前的这种方式啊。在这是吧,这样的这个写法呢,它是一个错误的写法。啊,这个注意一下好,那么应该怎么做,那我写个直接的啊,叫正确的写法。哎,这呢,就一个比较讨巧的一个做法了,你看我这么着啊,A risk.as list,然后呢,调这个方法呢,它不是返回一个,哎叫一个list嘛,比如我这个让他呢,当这个death了,想办法让我们这个death呢,它这个size呢,至少不比它短,或者说呢,就跟它一样得了。这个我怎么处理呢?哎,我这样去写啊,你一个,诶,因为它里边不是都是对象吗?就object类型的一个数组,这个数组的长度呢,是S2C点4S。这个是它是不是就很巧妙了。这时候呢,相当于我们里边呢,有哎塞个元素。啊,就是new的这个object嘛,哎,放到这里边儿了,然后呢,这个呢,Size呢,不就是跟你的长度一样了吗?就是我们再去copy呢,不就可以了吗?哎,再run一下。
20:07
你看你看,这时候我们就复制进去了。OK啊行诶,所以呢,就是相应的一些知识点呢,我们都讲完之后呢,就是大家呢,就看各自的这个聪明才智了,八仙过海各显神通了啊,遇到具体的问题看你怎么去操作了。好,这个大家回来啊,这个呢我就不说,诶这块稍微看一下啊呃,我们以后呢,可能会遇到这样的这种场景,它呢叫提供多个叫安啊multiable叉叉叉这个方法说呢,该方法返回一个叉叉叉的不可修改的视图。啊,这个呢,可能大家之前没有见过啊,不知道什么意思,相当于呢,我们针对于某一个,诶集合来讲呢,把它变成是一个只读特点的。哎,稍微的说一下。嗯,举个例子啊,你比如我们这块,我们有一个least。然后这个呢,我们叫例一。哎,这是它,然后这个例子一里边呢,我们去ADD啊,我就。
21:01
写几个数据啊。这个咱们就是一个哎,自动装箱了哈,然后这个例子一的话呢,显然我们是可以往里边去添加数据的,这个呢就属于可以写入数据。哎,可以写入这个数据。这是没问题的啊,那如果说我们在有些场景下呢,只让用户可读。啊,你不能够往里边去添加数据,也就说你不能去修改这个数据了,这个我们就可以用我们刚才提到的这样的一个操作啊,Collections,点这个叫an UN motiable list,把这个list家去,然后会返回list。这个呢,比如叫例二了,那么你得到的这个例二呢,我们就只能去读,不能够去写。只能读。哎,不能写,不能写的话呢,就是意味着你看我们这个例二点,如果呢,你去调这at的方法写个A是吧,这个呢是不允许的。
22:03
你看是不是就报错了。哎,不支持是吧,那你去操作这样的一个异常啊,好,那能不能读呢。哎,不能写是吧,哎,这个例子二,哎,我们去这个get一下啊,咱们找一下这个索引零那个位置的元素,其实呢,我们就想找这个34了啊,哎,走起。你看这个34就出来了,这个返回的这个你注意啊,其实呢,里边的元素呢,就是这些,所以我们取零的话呢,自然而然这个34呢,就能够取出来了。哎,这呢就是返回的这个例二呢,只能读,不能够去写入啊。这个能想象出来他大概他怎么做的吗?哎,其实呢,这个事儿。不复杂。嗯,这个你看啊,咱们加个断点好久没用debug了是吧,Debug一下。诶这个呢,我们就进入这个源码来看哈,点进来啊这块呢,它进行一个判断,判断呢我们就直接走这个。
23:01
呃,判断呢,走这个下一步诶到这儿了是吧,然后再走一个下一步啊走到这儿相当于它这是个触哈,诶这个我们历呢实现了这个接口了,所以呢,他就选这个了,选这个的话呢,他就拗了一个当前这个结构的一个对象了,是吧。啊,没问题哈,探究的这个对象呢,是长这样子的,行,那咱们就接着呢,就。出来吧,知道了啊,知道以后的话呢,下边这个叫爱啊,那咱们先把这个就执行就结束了,我把这个给它打开。当你试图去艾特的时候,咱们看他这块呢,是怎么做的啊,再去执行一个第八个。上面这例子二呢,其实咱们知道啊,它反过来其实是长这个样子的一个list。挺长的啊,然后呢,现在我们去调离艾特方法,我们直接进源码一看,哎哟就跑到这儿了。啊,什么意思呢?哎,这个时候你看一下啊,咱们创建的是这个类的对象,那这个方法是在哪呢?它是在。诶,往上走是这个类里边。
24:01
啊,什么意思呢,就是咱们刚才new返回的这个是这个类型的,这个类型里边没有爱的方法,它的这个负类的话呢,是这个类啊。这个类里边它定义的艾方法了,所以呢,我们在这调这个艾方法,咱们看似调的是a release里的艾,其实不是a release来艾,就是咱们看到的这个艾方法。刚才我们看到这里边这个矮的方法。啊,这个方法就是,如果你想去添加一个元素,我就让你抛一场,如果你想remove一个,我也让你。哎,让你这块呢抛异常,所以凡是这个下边呢,涉及到呢,你是想修改的,我都让你抛异常,你要是不修改,那我就让你这块呢去做操作。哎,就这个意思。啊,这个大家注意一下就行啊,行,做一个了解就行啊。好,这呢是我们说的它了,然后回过来在下边呢,At all这个就不说了啊,这有一个同步。咱们前面呢提到过这个事儿啊,说呢像瑞release啊,像哈希map都是线程不安全的啊,那线程不安全呢,当然它又作为主要实现类了,那万一要是遇到多线程问题,解决相差问题怎么办呢?
25:07
来说呢,即使这样的情况下呢,我们也不会去用这个vector和哈table哈,咱们可以考虑把a release和哈希map呢,变成一个限制安全的,那就使用这样的方法就可以了。啊,OK啊,CTRLC过来怎么做?啊,这个咱们再来一个啊。来一个五。诶这么着,诶就以咱们上边这个为例吧,咱们这个尔威利斯呢,你看它就不是一个线上安全的。哎,我想怎么把它变成安全的,怎么办呢?其实很简单,我就调一下这个叫啊synchronized list,把这个LIST1呢往这一扔,它就给我们返回一个list。这个呢叫例二。这个例子二呢,就是线程安全的。这也太简单了是吧?返回的这个例子二,哎,就是。哎,线程安全的。啊,那类似的道理,你比如说诶声明一个哈希map,我叫map了啊,你有一个哈希map。
26:05
哎,这么着,哎这个比如跟上面对应这个也叫一吧,然后现在呢,我们,哎第二下这collection点啊C。啊,它呢有一个方法就叫map,所以通过这来看的话呢,我们collections呢,它也是能够操作map的啊。我把这个MAP1往这一扔,它就能给我返回一个新的哈希map。哎,叫MAP2了。好,那这块我们还得需要呢,做一个这个。诶,这个我们直接让它自动生成吧。在这啊,Alt加个回车。这样是吧,生成这个map,这个叫二了,那么我们得到的这个MAP2呢,我说它就是线程安全的。其实呢,里边这个操作的话呢,大家觉得是怎么做的。就是包一下就行。啊,就是包一下就可以了啊,你看这块我在这加个断点,咱们呢再去做个第八个。
27:03
我看一下这个方法它到底怎么调的是吧,然后这块进入源码。哎,就在这儿是吧,说生成一个具体的对象了,然后这块我们走数据到这儿了。但是的话呢,相当于我们目前呢,他给我们返回的是这样的一个具体的一个例子了。那就它哈,然后呢,我们再去往下走啊,其实这块就出来就行了啊。诶再走就跑到下边了哈,行,这个呢,返回的这个是没问题的,这个呢,针对于创建这个对象说这呢,我们也没看出来呀,是因为咱们不是没调相关的方法吗。比如在这个位置,诶,我把这个就先停了啊。在这个位置的话呢,我们如果通过这个LIST2点,咱们调一个A的方法,哎,我就写个数据,咱们看看这个A的时候呢,你是不是加了相关的这个啊同步了。来我们这时候呢,做一个第八个。看这方法呢,我们进入源码看一下。嗯,这个呢,是因为我们写了个123,它得有一个自动装箱嘛,掉到这儿了啊,所以我们就先出来啊,出来以后呢,我们再点这个。
28:01
进入这不就进到这儿了。哎,就是我们刚才这个艾方法呢,其实是调到这儿了,调到这里边其实你也看到了哈,这个方法呢,不就拿这个S给包了一下嘛。里边呢,还是调我们本身的,你这个传进来的这个list,它的一个方法。哎,下边这个你看类似的都是这样的处理的。那下边这个方法呢,都是我们加了一个C空的包了一下,里边呢,我们这个C其实就我们刚才传进来的你这个list还是调你这个list的相关的方法,只不过呢,C空站一下就行。哎,这呢就是叫线上安全了啊,所以处理方案呢,非常的简单直接啊,这个卖呢也同样的道理,我就不演示了。好,那么关于collections呢,里边呢,这些方法呢,就到此为止啊,诶大家呢,需要呢,去操作我们这个集合了更多的呢,其实就是增删改查,咱们还是用本身的这些里边的方法,诶如果呢,有一些其他的一些需求,像排序啊,反转啊啊这种比如说随机化一下啊是吧,最大最小啊查找啊,这个时候我们可以回来用一下这个工具类啊就可以了。
29:01
好,那这块呢,关于整个这个类呢,说明我们就到此为止,这儿呢有一道课后练习题。诶,高联题,看看这个题有点意思啊。说呢模拟斗地主洗牌和发牌,牌呢没有排序效果如图。哎,斗地主应该都玩过啊。啊,这个呢,我们一副牌啊,完了以后的话呢,诶三个人斗地主的,所以这块有Tom有Jerry啊,还有你三个人呢,就发牌了,发牌以后呢,肯定呢,这个顺序呢,你看就是乱的啊,所以有一个洗牌的过程,最后呢还有一个底牌。哎,我们呢,就把这个效果呢,给它做出来。哎,这个看好做不。哎,这块给我们提示了哈,嗯,提前呢,我们提供了一个死锥形的数组,里边呢,就是放我们对应的这个数了。然后还有一个死针形的叫color啊,这块对应的就是我们四个花色啊。哎,然后呢,我们可以考虑呢,组合成一副牌,这呢是装到a real list当中了。这都是给我们的这个提示信息。
30:01
看一看怎么去处理。啊,这个叫。扑克是吧,扑克牌啊。来整个没方法啊。嗯,首先呢,咱们大方向来讲看几个步骤哈,第一个步骤。是不是你得先组成一副扑克牌啊?嗯。啊,衣服。啊。扑克牌啊,这个所谓的组成一副扑克牌呢,其实呢,就相当于我们把这个牌呢,就都放在咱们的当中了。也就是说我们生成的这个而立里边呢,应该有。54张牌是吧。OK啊行,这里边儿我们可以使用的呢,就是上面提到的这样的一些元素。或者叫原材料也行,你看怎么着去组装,组装到这里边。好,那组到这里边以后的话呢,第二步。哎,其实组的时候呢,会有一定的规律性啊,所以第二步呢,你得洗牌。
31:00
这个洗牌呢,相当于就把里边呢,各个位置元素呢,你得。打乱它是吧,我们刚才呢讲了一个方法。叫shuffle是吧。对,就是刚才这里边儿的这个方法了,这个呢,我们就可以呢,给他洗牌了。打乱了。OK啊行,那么打乱以后呢。下一步干什么呢?对,我们就可以从这个瑞里边取这个牌了,就可以发牌了,是吧,但发牌的话呢,我们这里边有好几个角色啊,每个角色的话呢,它都有好多张牌,实际上呢,我们还得创建,至少的话呢,是不是得有三个。容器是吧,虽然这个底牌的话呢,应该得创建四个吧。啊,四个单也用来装吧。哎,所以呢,下边啊。这个呢,其实呢叫发牌了,但是发牌呢,其实这里边儿这个细节的话呢。哎,我们来个三点一下点呢,要得又得呢去创建,呃,一个是三个角色和啊一个底牌是吧,对应的。
32:02
啊,四个A。哎,用这个呢,咱们去装他们各自的这个牌。啊,然后呢,最后这个呢,就比较简单了,发完牌了也装完了,那其实呢,下边就是一个便利显示是吧。哎,便利显示。哎,这四个就可以了。就是这样,我们大体的一个思路啊。好,咱们来做一下,首先的话呢,我们看一下怎么把这个牌呢,得组合到我们这个当中。其实就签到循环就行是吧。嗯,签到for,先来一个for,一个I呢等于零,I呢小于,注意先整谁。先整花色吧,不都一般说方片A。都没有说二方片二梅花吧。啊,所以呢,先整这个花色啊。哎,先整他点L一下,然后I呢加加。哎,这么着啊,然后再for循环in,那个J等于零,J呢小于number点。
33:02
啥接呢,加加。好在这里边的话呢,我们先把它组合成是一个字串。然后呢,添加到我们这个坡里,或者直接我们就直接在这块来艾特添加了啊。嗯,先呢,拿这个花色是吧,Color I。哎,加上我们这个color,诶不是color number。接。哎,就这么着一下是吧。哎,你要觉得说呢,中间离得太近了,加个空格,那你就整个空格也行。这个都是小事儿。诶空格一下好这个呢,比如说就呃,一开始的话呢,就是方片A,方片二方片三以此类推,然后在梅花A啊以此类推,好这时候我们这一副牌呢就出来了。嗯,出来以后啊,对,还没完事是吧,这个别忘了啊,还有大小王呢哈。添加大小王啊,这个咱们就给大家整到最后吧。啊,先整一个,比如说小王。
34:07
诶,我就记得原来这个上大学的时候呢,那时候我们坐火车哈,我从石家庄到长春得20个小时,当时哈。然后呢,路上也比较无聊,然后呢认识几个大学生,我们就打扑克牌,然后打斗地主,最后呢发现诶多多一张牌。说这个牌里边有点多,然后呢,这个就把这张拿走了,打着打着发现诶应该还多,最后发现呢,一共是多四张牌。我这个牌也是。有点劣质是吧。对,因为多一张,以为多一张呢,结果实际上呢,你打了个炸,发现呢,别人手里还有一张,又多一张,其实那一算一共多四张。第一次见到哈。钱应该不至于没打钱是吧。嗯,好,这个呢,我们就添加进去了,诶这一共呢,就54张牌就全了啊下边这个洗牌刚才我们说过了,这个还是有必要的啊,我们使用这个开点叫杀否。哎,然后呢,把我们这个例子呢,就扔进去。
35:03
行哎丽a poker。呃,棋牌结束啊,有同学说呢,我这个。好好洗洗。嗯,不用了是吧,一次就行哈,嗯,就掉一次就可以了,嗯。好,下边这个啊,哎,创建三个角色和一个底牌,这个咱们new一下这个a list是吧。这个就。哎,丽这个呢,比如说叫Tom,那咱们这个名呢,假设就就叫这个吧,这就Tom啊。然后整四个。Jerry。比就叫他这个呢,Me自己剩下这个叫底牌,哎,Last比叫car字啊,最后剩的这个牌三张啊。好,这个呢,四个容器已备好,接下来呢,我们需要呢,往这里边儿去装了哈。这个呢,我们就是便利一下咱们当前的这个poker了。啊,比如我这块呢,我使用这个叫一般的for循环啊int一个I呢等于零,I呢小于啊poker.size然后呢I呢加加。
36:09
诶,大家看一下这块我们怎么去发牌呢。想想。嗯,就是这个I呢,一直从零一直到呢,我们这个角标呢是53了啊嗯,就是一个一个去发是吧,所以我们这块呢,可以控制一下,让这个I呢去取模三得了。93呢,比如说叫等等于零。啊,这个我们就给了汤姆。啊,给我们可以加个一嘛。哎,所以这么着啊,这个我们就诶Tom点他就get一下啊,咱们当前这个叫poker,哎get一下,哎所以哎没问题是吧,好I if I呢取模三。哎,对,等等于一。这时候呢?我们就给了Jerry。诶,CTRLC啊,这就给了Jerry了啊,嗯,然后呢,这个还得写LC衣是吧,I呢取模三,哎,等等于二。
37:09
这个呢,好像这样一写呢,发现好像有点问题是吧,咱们在这考虑啊,好,这个呢就是给自己。这样要玩的话呢,这个牌就分完了啊。对,这个我们底牌就没有了。怎么办啊?先把底牌先留住。先留也行,问题是咋留啊,你说就是我们这个呢,先取这个前三章给了他。然后的话呢,我们从这个I012从三开始,这意思吗。那也是个思路是吧,也行,但是我想写到一起啊。写底的话呢,或者说我们刚开始这个牌呢,我们就先发了,到最后剩几张的时候呢,留下来,一般咱们发票不都是留最后剩下的。那我要写的话呢,就不太适合往这写了,我这么着,我写的开头如果呢,I呢是。应该是大于了。
38:00
诶看我们这个怎么写,这个是不是poke.size是不是,诶潜意识呢,说减个三看对不对啊。比如说呢,我们最后呢,一张牌的角标应该是pro减一减二减3A。这就剩三张牌吧。那这个时候呢,我们就给了咱们最后的这个last.card。它呢,去添加一下我们这个叫a poker.get一下索引I,然后呢,我把下边这块呢,都设计成是这个else if的。啊,只要呢,他不是最后三张牌,剩下这个牌呢,你们就分了得了。最后这个位置呢,其实写成L也行,写成L4呢也可以了啊。是不是就OK了?嗯,行啊,然后最后呢,它显示一个效果,诶显示的效果在这儿呢,啊汤姆啊行,那咱们就回过来这个呢,便利一下四个a list,咱们就直接这样打印一下啊叫Tom冒号。这个我们就直接打印一下就是Tom了。因为这个名呢,咱们就叫做Tom了啊。好,以此类推啊,CTRLC。
39:00
哎,这样呗。这呢,叫Jerry啊?Garry啊,然后这个呢,叫me是吧。这个写成大写的吧。哎,这个呢,就是啊。这个呢,是。底牌啊。那底牌。哎,Last,咱们car啊。好,这块我们看一看这个效果啊,Run一下。嗯,行。哎,应该没问题是吧,哎,大王在这儿呢,小王在这儿呢是吧,哎,可以。好,这个呢,我们就这样来处理就行了。啊下来呢,大家自己也可以写一写啊,当然呢,我们从实际玩牌的角度来讲呢,其实在方向牌以后,你要用这个QQ斗地主,他最后还有一个过程。排序是吧。对,他会给你诶重新整合一下,然后呢,诶从低的到高的,一般都是先放三啊四啊是吧,最后再放你这个大或者反过来也行哈,那这个排序的话咋整呢。
40:03
哎,注意这个的话呢,我就不讲了,大家如果有这个兴趣,你想写一写的话呢,我在这个咱们课件里边最后这个练习的,哎,这呢是斗地主,刚才我们做的其实是这样一个效果,然后呢,在这个基础之上呢,我们再把它做成是一个排好序的。啊,这个看看怎么做啊,这个呢,下边有一种做法,这个做法呢,跟上边这个不是说呢,稍微调一点就完事了啊,其实这块呢,稍微的麻烦一点点。啊,应该是能看得懂的啊,有兴趣呢,你就写一写就行好,那么至此的话呢,咱们这一章呢,就告一段落。
我来说两句