00:00
那接着的话呢,我们看下一个,下个呢,我们要写的呢,是这个customer list。就涉及到呢,我们这里边造一个数组,对我们这个customer进行这个增删改查操作的这样的一个功能,那么这个类当中的这个属性呢,这块也写出来了,有两个来CTRLC一下。找到我们这个custom list,在这个位置来声明这个属性,属性的话呢,我们也可以都给它私有化了。行,然后这呢,都是一个分号。Control shift f一下,这里呢,关于这个customer呢,这块报报一个问题,那很显然呢,我们当前呢,用到的这个customer呢,在别的包下,我们前面昨天呢讲过import了,只要用别的包下的是不是都得导入一下啊,哎,这呢就得IMPORT1下行,那这块的话呢,我们接着往下看属性就有了,接着的话呢,我们重点要提供下边的一些方法,这就是我们custom list中的详细的方法。
01:09
这也是咱们重点呢,需要完成的CTRLV,当然第一个的话呢,其实严格说布置方法了,勾到气。好,那我们就来看一下这个功能的话呢,分别应该做什么样的设计啊,首先第一个呢,是一个构造器,构造器里边呢,有个擎参叫total customer,嗯,相当于呢,就是让我们去初始化咱们这个数组,告诉呢这个数组到底多长啊,就是这个意思啊啊你要是不清楚的话呢,后边这个PPT呢也有说明啊,这呢就关于这个构造器的一个解释说呢,它呢主要是用来指定我们这个数组的最大空间啊,也就是数组的长度了,行,这个时候呢,我们可以加上一个文档注释。
02:00
啊啊,具体的注释信息你可以按照这块写也行说用来呢初始化我们这个数组的啊,一个构造器。行,然后具体这个total customer呢,这个就是我们这个参数了,用来指定数组的长度,或者说呢,来设置我们数组存储数据的最大值,最大呢,不就是你的长度这么多吗?一个意思,当我们去创建customer list对象的时候,我们在里面就将我们这个数组进行一个初始化。哎,又一个customer类型的一个数组,那这个时候呢,元素都不知道是谁呢,显然呢,得用这种,呃,动态初始化。这样的方式,昨天呢,咱们讲这个B的时候,咱们不也是这样做的吗。哎,这要注意啊,总之呢,就是你要操作这个数组之前呢,一定要给它初始化,至于说你是显示初始化还是构造器都可以,咱们这儿呢,都选择了在构造器当中进行初始化了,这个total呢,默认值是零,这个显示写成零了,不写也是零。
03:11
哎,这个都是一样的,好,这个呢,跟咱们昨天讲的这个办法呢,这里边的这个变量的作用呢是一样的,都是用来记录咱们客户的个数的这样的行,下面的话呢,我们就写如下的一些方法,涉及到呢,就是艾添加replace修改,Delete删除,这呢显示就是增删改查这样的功能啊,这个查的话呢,这是查询所有的,这是查询一个这两个,然后呢,获取所有的,到底有多少个这个客户啊这样的操作,那就一个一个来写,首先第一个。啊,这个呢,我们是将指定的这个客户添加到这个数组中。行指定的客户的话呢,就是咱们这个customer了,那这个return返回值,那就是添加成功返回的是true。
04:10
成成功啊,然后false添加失败行这样的情况好了,那添加的话呢,还是有可能失败的啊,怎么就失败了呀。对,满了就失败了。嗯,这是我们说的一个情况,那我们要是添加的话呢,是不是你上来先判断一下是不是满了是吧,所以我们这时候来判断啊,这个判断的话呢,怎么写啊。咱们已经是不是存了这个total头哥呀,哎,这个咱们记录是到底存了几个哈,已经存了total头哥了,如果发现它呢,大于等于了,我们这个数组叫customers,它的lengths。
05:01
比如你这个长度是十,然后我们这个total呢,已经是十了。说明已经是最大了,对吧,这种情况下呢,是不是直接return一个false啊,就填不了了啊,那不是这样的情况呢,那就是可以往里放了,这个时候呢,写这个else也行,或者我就不写了,直接在这块写是不是也可以。哎,是一样的,在这儿呢,我们就直接呢,把它放到我们这个数组当中,数组的话呢,我们是先放在这个total的位置,这样,然后接着呢,你这个total呢,记得给他加加一下啊,要是首次调用我们爱的customer,那你这个total就是零,就放到这个第一个位置,放完以后呢,加价变成一,那再去掉,那就是放第二个位置再加加。哎,跟咱们昨天写的那个是一样的啊,或者直接一步是不是就合成一下。对,CTRLCCTRLV,我把这个加加呢,写到这儿是不是也行啊,一个意思啊,嗯,完事以后的话呢,记着给它return一个啊,因为这呢需要一个返回值表示呢,你添加成功行这块没问题吧。
06:17
啊,没问题,好,这呢是我们说的叫添加的功能,然后接下来。接下来这个呢叫replace,就是修改,修改指定索引位置上的客户信息。指定索引位置的,哎,这个客户信息这个啊,那这个return呢,也是一样的,这叫修改成功,就是处诶false修改失败,好,那修改成功,修改失败这个我们都得去判断一下啊,怎么算成功,怎么算失败呢?跟谁有关?
07:03
对,跟这个index有关,你这个index要写的不靠谱啊,是不是就就失败了,对吧,怎么叫靠谱不靠谱,哎,对说的对的,比如说啊,比如说咱们这个数组的长度是十,我呢就存了三。咱们这index是索引,所以这是从零开始的索引,那我们这个index的在这个问题当中,它的合理范围是多少啊,应该是不是就只能是012啊对,除了这三个之外呢,后边这些都不能够去做修改,前面这个呢,你变成负的了也不可以,所以我们这呢,先写这个符合的不符合的都OK啊,比如我们要先写不符合的呢,那就是index,你要是小于零了。或者呢,你的index大于要写肯定是写total了是吧,有没有等号。有没有,有的很坚定说没有体会一下,我们刚才偷偷是不是三,你这个你带着能写三吗?不能啊,那所以这个等号你就得写上。
08:11
这呢,这不都是不满足的吗?Force等号得有,然后else else还是那个意思啊,写不写都行,反正上面已经有return了,直接在这写也可以,只要能到这说明呢就不满足他说明呢这个就有意义,有意义我们就做修改,把我们comos这个数组的index位置上的元素改成新的。就这样修改完以后直接return一个出。这个能看懂吧,可能这个要是画内存结构的话呢,它其实是这个意思啊,这是占,这是对,这是咱们造了一个叫customer list。看什么list在这个堆里边,你看啊,堆里边的话呢,人家就有俩属性,第一个呢,属性是一个数组,第二呢是这个total total的话呢,默认值还是个零,这个数组的话呢,叫cosmos,既然是个引用类型,咱们说了引用类型要么呢是。
09:13
Nu要么呢,是不是就是引用地址啊,哎,咱们声明的时候呢,没有负过值,它是个nu,但是我们用构造器的时候给它拗了,拗的时候呢,只要是拗了,我们这块呢,就是一个新的结构,这个放到这边吧。又来一个数组,假设呢,这个数组的长度是十,往下放,这有个地址值,把这个地址值呢就给了我们这个cosmos了,那我这就指过来了。然后呢,咱们这边通过这个customer list,咱们要是调这个方法的话呢,这不就能够找到我们这个customers,这个customers呢,也初始化了,我就能够找到指定这个index这个位置,如果呢,你这块呢,也确实存了几个人了,这个嗯,每个位置呢,咱们说都是一个customer customers呢也得是一个对象了,所以我们都涉及到都是new的这个对象,这就是这个customers,然后每一个对象呢,哎,把这个地址给了我们这里边的每个位置。
10:14
能看懂吧。就是这个呢,每个位置放在这不都是一个customer吗?Customer的话也用,也是引用类型的,那你得用一个对象了,所以这呢放的仍然是地址,咱们现在做的是一个叫replace的操作,那就好比是一开始的时候,比如说人家这个,比如索引这个位置哈,指的是它,你现在呢,想给他做修改,相当于呢,我们是又拗了一个对象。可以这样理解啊,又拗了个对象,然后呢,把这个地址呢给改了。诶这个样子的,那原来这个呢,因为没有指针指向了,然后它呢,就被销毁了这种。哎,是这样的一个方式,当然也有同学说说能不能我就还用它,然后只是把这里边属性改了呢。
11:02
也可以是吧,也是可以的,那就相当于你把它调出来以后呢,去修改这里边儿一个属性也行,只不过咱们现在呢,我是选择了是重新又造了一个,因为你会看到我们这这这不又重新传过来一个是吧,当然这个也也不一定哈,我这传的这个如果要是就是你原来这个引用地址的话呢,相当于就是改了里边的东西了,这取决于不能从这看了,取决于咱们一会儿呢写那个customer view的时候你怎么写了。Customer view的时候,如果我们是新new了一个你你往这放,那就相当于是这个蓝色的方式,如果你要是还用的原来那个对象,只是让重新给它set了一下某个属性,传过来的还是原来的这个地址,那就相当于只是改了这儿了,能理解吧,啊,行,这就是关于这个replace,这是我画了一个简图,实际上这个结构大家下来可以画一画,已经变得比较复杂一些了,这个呢叫replace,接下来删除。Delete customer index叫删除指定索引位置上的客户,好,这个return呢,仍然是这个意思啊,就是处要删除成功。
12:16
然后false删除失败,OK,那么我们还是先考虑一下怎么叫删除成功,怎么叫删除失败。是不是跟修改类似,你修改只能修改有的那些数据删是不是也得这样,所以呢,这块呢是一样的CTRLC。如果呢,你这个index写的不靠谱呢,就根本就是false。比如说我这呢,在这画了一个图,比如说呢,像这个问题,一二三四五六七八九十,我这个数组的长度是十,我存了五个客户,我们现在能删的范围。是不是就从零到四,哎,不是这个范围的都不可以,所以呢,我们这就写了小于零,或者呢,你是大于等于我们这五的,就是这块啊,这都是呢,叫return false的,然后不是属于这个范围的呢,就都是可以删的,好怎么删,比如说我现在想删掉它。
13:22
想删掉它,你说四跟五怎么办?往前移,嗯,往前移是一种操作的策略,有的同学有没有同学会这样想说你想删到他,那就光把他这个位置制成个no不就完了吗?对不可以,咱们讲数组的时候呢,其实提到过这个事,数组呢,其实它是一个有序的啊,有序的就是它得一个一个挨一个啊,就是当你要把其中的某一个删掉的时候呢,数组当中都得这样做,就是你后边一个呢,要把前面一个覆盖掉,后边一个再把前一个覆盖掉,把后边这个呢,你改成是个闹。
14:06
只能是这样做,也就是说数组呢,当然另外一个角度,数组都是连续的空间了,中间呢不允许空着,后边又放别的。啊,所以呢,只能是后边往前移,所以这个事儿的话呢,删除比我们想象的呢,要稍微复杂一些,我想删的是index的位置,那我还得需要呢,写一个循环,把index后边那些元素呢,就一个一个的往前移啊。对,这块呢,就逃不了一个for了,哎,我int I呢,就从咱们的index开始,I终止的范围是哪呢?就是你想办法让他能够取到最后一个元素就可以了,是吧,咱们可以先空一下啊,然后爱加加。咱们想做的呢,就是把这个customer这个I这个位置拿它的后一个位置呢去替代,这不就后一个付给前一个吗?那我们只需要保证这个位置能够取到最后一个就行了。
15:07
那这块怎么写,这个我写是卡点list吗。不是应该写是不是啊。你要写看list是不是就蹦到这了,咱们现在呢,你有几个应该是从这块考虑啊,我这要写透透这样写行吗。这样写是不是你还得再减个一呀?你想我这要光写total,这就意味着你的角标呢,最大能是total减一,Total减一,你再加个一,这块变成total了,是不是根本没有total那个索引啊对,所以这个呢,记着要减个一。这样的话呢,你能取到最大是total偷减二,再加一就是total偷减一,Total减一不就是最小的那个索引吗?哎,最大的那个索引。哎,这就可以了,后一个气管前一个通过一个循环呢就搞定了,别忘了你最后一个呢,是不是还得制成绕啊,哎,最后一个最后啊,有数据的这个元素需要制空,哎,最后一个元素呢,就是我们customers total减一的位置呗,把它改成个no。
16:23
完事了吗?你这是不是一个delete呀,加的时候呢,你记得偷偷加加了,你现在减了一个呢,你头头不也得捡捡吗?这个千万不要丢了,然后呢,你再return一个出。这块呢,稍微复杂一点,看能看懂吧。哎,这个要会写啊,这是我们一个叫删除操作,那这两个操作的话呢,其实也可以合并,可以合并,你看我咋写啊customers哎,上来了就写个透透减减,看这样行不行。
17:06
这就成了,是不是先调用的是total这个位置的元素了啊,去数组里边智能照,然后再减减,那我根本就没有total这个索引位置吧,所以呢,这个呢,诶正好还体现了一个前减减的一个事儿。对吧,呃,先减易,这不正好能符合你这个先减易的事吗?对,然后你自己也减减了,嗯呃,他自己先减易是吧,先简易以后呢,这不相当于把这个事做了,然后呢,你自己在呃这个这块也用的是简易的这个数,哎,正好挺好啊,这样写没问题吧,没有,这是删除,接着get all customers后边这些呢,就相对来讲简单一些了,这呢就是获取这个所有的客户信息。哎,获取所有的客户信息,这个时候呢,注意你不能在这直接return一下customers啊。
18:00
因为你这里边儿是不是有好多是空的呀。如果呢,我们数独长这个样子,存了五个元素,咱们现在呢,掉了一个方法呢,只想把这几个信息要到这些,那就不要了,那这时候怎么办呀,还想返回一个数组。是不是我们得去造一个数组啊,对,去new一个啊,我们去造一个customer类型的数组,我叫costs啊,New一个customer,那么这个数度的长度是多少?诶,Total接着for循环in I等于零,I呢小于,诶,Car次点lesss,或者你直接就写个total是不是也可以?它俩值是一样的,爱加加,然后呢,我们这个cos这个I的位置,就是拿我们这个comos I的位置呢付过来的,然后呢,敷完以后我们就都有元素了,我直接return一下这个卡S这样。这样写,这时候呢,你注意啊,我是真的把这个每一个对象都复制了一份吗。
19:07
每一个customer对象都复制这一份吗?对没有吧,我复制的是什么呀,我复制的只是地址值,哎,复制的值是地址值,意味着是这样子的啊,就是嗯。这个其实要画起来就是那比较复杂一点,因为咱们目前的这个cosmos这都在这个堆空间当中的啊。我我我就我就简单的画吧,就是这呢,是原本你的这个数组,原本这个数组假设长度是十,咱们呢,存了一个两个三个四个元素,然后我们现在呢,又造了一个数组呢,就是常数,就是你这个四,然后原来呢,你这个每一个位置呢,存的值都是个地址值,指向的是你真实的一个对象,好多对象啊,这个四个嘛,四个对象其他的都是空了,我们现在的话呢,又造了一个数组,这个数组的话呢,长度就是四,咱们只是把人家原来这个数组的地址拿过来了,指向的对象呢,还是原来的这个对象地址拿过来,还是这样它。
20:16
这要注意,其实也应该这样哈,你想人家这块如果要做一些修改操作的话呢,你这块呢,是不是也应该调的时候,也应该是修改以后的呀,对,所以说这个这些对象呢,没有必要再去复制了,直接呢,我光是放地址就可以了,我直接呢还指向你这样唯一的一个对象就扣OK啊行,这呢是咱们说的这个事儿接下来。这个呢叫get,获取指定索引位置上的客户。哎,位置上的这个客户,那指定的位置呢,就是index,那很显然这个index呢也可能不靠谱,所以我们这呢也得做个判断,说如果我们的dex是小于零的,或者你这个ind是大于等头投吧,哎,这个时候呢,你就意味着找不到哈,我就return到了,否则的话我就return一下customers index OK吧。
21:19
这让我们return写一下这个,呃,如果这个找到了元素啊,则返回说,如果没有找到啊,则返回闹,那回头呢,我们就可以根据调这个方法呢,它返回的是不是一个闹来确定这个位置上呢,有没有这个元素,哎,是这样,最后一个呢,叫get total。这就相当于咱们这个total的一个get方法了啊,它呢就是来获取这个客户的数量,或者叫存储的客户的数量,有一些空的这个呢,就直接return一个total呗,Total啊你你别写成它啊,别写成customers.s了,这是不是就错误的了。
22:13
哎,这要小心一点啊。虽然说语法上不报错,但是这个事儿不对,有几个就返回几个。好,那么至此的话呢,我们就把这个customer list这个类呢,就写完了,你就这样来写啊。
我来说两句