00:00
啊,就写完了,没有任没有什么问题吧。啊,很好理解,那现在呢,我们再写一个便利。便利这个链表。链表的一个方法,这个对于我们来说也很简单,我直接写个list。那历的我们把它遍历出来,便利呢,因为同学们都知道这个hide不能动,所以说我上来过后呢,先判断一下你现在是不是一个空链表,对,如果hi等于no,说明你当前这个链表是空的,那就不玩了,就是链表为空。对吧,这个链表链表为空。然后我就不玩了,我就直接。那否则怎么办呢?否则我们还要用这个辅助指针帮我们来进行便利。因为害的不能动嘛,那下面呢,我们就遍利一下while循环,还是老规矩,先写一个死循环在什么情况下。他就需要退出呢。
01:02
啊,一样的道理,现在这样写啊,如果current。哦,Current,呃,不能不能使点next啊,就应该是这样子,Current等于空。大家理解这意思吧,呃,为什么我要这么去写呢?因为我想先把它打印一下对吧,所以说这个如果看领空就说明它真的不能再玩了,否则呢,我们就输出这个信息,这个能理解吧,也就输出这个信息。输出这个雇员的信息,我就直接这样写啊,同学们。那格式化一下信息,我就把它的名字和编号打出来就可以了,编号百分号D名字等于百分号S在哪里呢?就是current的这个ID,哦,这个地方我写成ID吧。好不着急啊,然后呢,我把他的名字也输出出来,内蒙,诶写错了内蒙。好,来一个就输一个,那待会儿为了好看呢,我在这儿,我在这儿事先搞一个这个东西。
02:06
啊,搞一个什么呢,这个。大家知道我要做什么事吧,就是待会显示的时候,你要好显示。我用一个箭头就代表待会我打一个链表的时候,它是咔一个指针指过去的,感觉好像是很形象的一个链表。对,到时候我来一个就就打一个啊,来一个就打一个,而且呢,我这也不换行,就是他在进进这个便利的时候,就把他当前这个链表的都打出来。啊,这样一个指针指出去,然后不要忘了一件事情叫break。Able。好,这样。这样把它写完,写完过后我们是不是还少了一句话呀,同学们,对,还是不是要往后移动一下呀?哎,得移动一下来,Current等于点next。呃,那么我们写的时候呢?呃,会经常忘掉这句话。好,同学们,List。也就写完了。
03:00
哎,那还有问题吗?哪有问题?叠哪个地方要哪哪哪行写错了。64。这个有什么问题吗?呃,是在外哦,写到外面去了是吧?是哦,那那当然不对了啊,呃,怎么跑到外面去了啊,小心了啊,好,这个就没问题了,这就是人多力量大的感觉是吧?你要自己这写哎,没人提示你就很容易出问题,好,这个写完了过后呢,同学们基本的加入和显示就写完了。但是真正的加入到底加到哪一条列表里面,是不是要取决于我们哈希table来进行这个闪闪略处理啊。因此,我下面还要写我们的哈希table。哈希table是在这里出现的,来,同学们,那现在呢,我们来写这个哈希table的方法。来,走一个class。
04:04
首先我们知道哈希table里面呢,它包含了一个。链表数组,所以说我上来给我先定义这个家伙。Va l,因为它本身不变,对吧,那我就写一个叫做什么呢?Employee link的listray。那么它的类型是什么呢?它的类型是什么呢?它的类型是一个R。但是这个类型里面放的是employee list。这个大家看看能不能理解。好,然后我先给他溜一把啊,当然这个地方也可以这样子啊,我如果用自动,自动我写到这让他看的更清楚,如果我要溜一下这样写的六一个这样的东西。大小是多少呢?各位同学大小呢,我们让这个让这个哈希table在。在在创建的时候就定下来,我给他写一个赛字。
05:04
各位,这个size子呢,我写个va,诶问同学一个问题,如果我在进行这个。调它主构造器的时候,前面有个Val,请问这个塞子会成为什么东西?是不是会成为成为它的一个只读属性了,也就是说这个size是不是已经变成它的属性了。这个没问题吧,好,所以说我直接把它写进去。大家看好了啊,写完了,也就是说此时此刻,一旦我创建这个东西,你就可以想象我们这边有一个link的历史的纸箱的这个这个内容。好,那么我就一共有几条呢?呃,待会儿我们再次传一个七。但到底是几条,你可以自己来玩,比如说老师说七条效率还不够高,我发现速度有点慢,我整成700条也没问题。因数组700个,一个模就全部解决了,甚至有些人写的更厉害,就说如果数据量特别大,他可以做两层这个索引,就说第一层索引这个一里面再进行一个索引,下面再分散我们的链表。
06:09
反正这个。这个优化呀,我告诉大家就是我们虽然Java里面有,刚才那个王长生也说我们数,我们这些数据结构呢,其实很多语言里面都提供了,但是你不了解它的底层机制,你自己其实也很难实现一些优化,比如说你们将来有机会自己去写一些框架。我我为什么说你们将来要自己写算法呢?你们自己写算法,自己写框架,你就要对,你就要自己的写些数据结构出来。直接如果往里面再追一段时间,比如说你们工作了,呃,三到四年,五到六年过后,如果往里面追的越深,那你的价值就会越高,你就越不容易被这个行业淘汰。所以这就是我需要同学们,呃,就是后面去加深的地方,老师呢,这地方可能更多的就是把这个大门给他打开,对吧,让他知道,诶数据结构确实还是非常有用的。
07:02
好的,那现在呢,我们就接着往下写。好的,那现在呢,真正的加入呢,是由这地方来导致的,他来决定到底这个雇员加到我们哪一条列表里面去,是不是。所以说我在这呢,要写一个方法叫艾,其实雇员还要从这来给我传进去。OK,没有问题。那我这一方要做一个什么事呢?同学们看我刚才的分析,是不是他首先要写个散列函数,这个散列函数到底怎么写,每个这个程序员算法不一样,比如说你对名字进行散列,那你先把名字进行一个,进行一个,就说把这个名字进行一个取法,把这个名字进行一个呃处理,让他得到一个唯一值。对吧,字符串是不是可以转成一个唯一的一个整数嘛,然后呢,进行哈希,你就如果对名字,你就这样去处理,如果只是对编号,那就更简单了。
08:03
所以这个就更灵活,你有些哈希map里面是很难做到这个灵活的处理的,那现在呢,我这里简单一点,我直接写一个哈希叫闪电函数。好,就叫哈希函数也可以啊,叫做呃闪列吧,叫散列函数,这个函闪力函数呢,我们写简单一点,就这么写啊。啊。看啊,阿西。啊,西放。在我写了一个,你给我传一个,你给我传一个这个词过来,你给我一个特。然后我给你返回一个int。返回一个什么印证呢?ID抹上我们这个size子,注意,同学们,这个赛字是从这来的。能看懂啊,因为我们说了这个赛制会成为。会,会成为一个只读属性。这在前面老师讲构造。
09:03
主构造期的时候,老师应该讲过这个东西。好,返回它只是将来这个闪力函数呢,到底怎么写,呃,要根据你的实际情况来写,因为我现在只是针对ID来进行这个添加和这个查询的,我就用ID,如果将来你们有综合的,比如说有名字,有日期,有地区,那你你这个闪利函数可以根据实际情况进行这个定制。可以定制。好的,那现在呢,我们这个闪电函数有了过后,我现在就可以这样写了,来VR,我现在确定你要把这个固源放在哪一个link的list的这个number,大家知道我在做什么事吗?好,我要做这这样一些事情。诶,写错了点ID,大家看我这句话是在做什么事?我是不是要去决定你这个,你这个员工是放在我的哪一条链表里面去啊。
10:02
因为大家知道我列表很多,我一共有七条链表。到底放哪一个呢?我在这儿返回了。这这句话的意思就是返回或者得到。啊,得到一个什么呢?得到该员工,该员工。员工应该加入到加入到哪条链表?那条。啊,那条链表。那当然你在查的时候,你你也得用相应的这个这个闪离函数,那你如果不用相应的,那肯定就不对啊好,下面我就调什么呀,Employee这样写了,同学们,我们就是this点。Employee里面的这个employee number。点我们的爱的方法employee放进去就可以了。大家看这个地方是不是就会调用我们刚才写的这个爱的方法把它找。加入到我们对应的这个链表的这个这个位置啊。
11:04
啊,这个大家应该能够看懂啊,只是我的名字取的有点长而已,嗯,不是什么大事,好,现在呢,加进去过了,加进去过后是不是我还要写一个。显示的啊,List。这个地方呢,我们写一个方法,就是便利我们整个哈希表。便利整个哈希表呢,便利整个。整个哈希表。那便利整个哈希表,其实说白了就是把整个那个表格打出来。但是我这里面没有用这个二叉数,就是单列表就很简单,那怎么来写呢。那首先你要用负循环了。对吧,那就是你首先得找到这个链表的一个,比如说是I吧,我们从零开始on t,谁呀,Until。
12:01
TI是我们这个赛制。是这意思吧,好,那我们实际上就去调用这个里面的I里面的list。是不是就可以了。没问题吧,同学们,没问题,肯定是这样子的嘛,肯定这样子的,好写完这个东西我们现在就可以测一下了,就是添加和显示,看看能不能跑起来,有问题我们再调。啊,因为我有添加,我有显示了,下面呢,这个显示和添加也写完了,我们先来测试一下这个代码。我们先这样做啊,我们写也写一个简单的菜单。写一个简单的菜单,不着急啊,同学们,那呃,根据我们前面这个老规矩,一般呢,我也会写一个K。对吧,写个K代表你书的内容,那现在呢,我们就用一个Y循环。出一下。次循环,然后呢,我提示他一下,比如说你输入一个ID,就表示添加。
13:05
哦,添加我们的这个雇员没问题。那么如果说你写了一个历史的,我们就叫显示雇员,没问题。非常的简单,那最后呢,如果你不想玩了,说老师我这个系统不想玩了,那么就退出。啊。啊退出,但是大家知道啊,这个内存退出,那就数据真的没有了,所以说为什么有些人喜欢定时刷新一把。这个定时刷新你写后,后台起个定时器不就完事了吗?就是说你你不用每次都去刷新,你比如说每隔一个小时启动一个定时器,刷一把数据到我们的文件,或者到这个数据库里面去,这些基本的原理大家要懂,因为你在面试的时候别人会问。你不可能问你会不会哈希table会不会花心,Map一般都会问。底层是怎么实现的?好,自己写一份,那肯定就很踏实了嘛,好退出那就先退出系统了,我们就退出系统。
14:06
那退出系统我们老规矩啊,那我先接收一下,接收的时候。我们用这个std诶。点read的一个na,然后呢,我就MATCH1把好不好,MATCH1把那就诶。这个地方写错了啊,是怎么回事?这好的case,如果他接收到一个爱的。那同学们想是不是我就让他提示他输相应的信息吧,啊,比如说输入。我们的这个信息,当你如果愿意用自增长,你可以在前面写一个ID,连ID都不用输,他自己啪啪啪这样子,那为了我待会为了为了这个,呃,为了这个显示效果呢,我还是让他输一下ID啊。理论上这个ID会自动给你分配啊,那我搜一下ID等于STd.read一个int,再来提示,请输入名字。
15:04
输入名字好,输入名字过后呢,我们再吸收一个名字std.read,一个nu,然后现在我们就可以创建这个雇员了,六一个employee,把ID给它放进去,把名字给它放进去,返回了一个employee。对,然后这个时候呢,我们就做一件事情,加到我们这个哈希,通过这个通过这个闪力表把它加进去,哈希table加进去,那哈希table加进去呢,这个时候我们需要先创建一个哈希表。好的创建。创建一个哈希table对不对,那又一个哈希。A。啊,稍等啊哈希table,那我定期条链表就够了,待会呢,呃也比较好看,然后我这个哈希table就有了,有了过后我在这里呢,来调用它的一个添加方法。
16:05
把谁封进去?Employee,好,同学们,我们玩一把先。看看添加这个有没有抛出什么异常啊各位运行。先把这个测完。OK。好,现在呢,我们二话不说,我们先来添加爱的。我们假设添加的这个雇员的ID号假设是十。啊,假设是十,那么我们写个名字叫宋江。回车,好,我们可以看到抛出了一个空指针异常。在哪一行呢?在99行,99行这个地方,它抛出了一个异常,哪个同学能够告诉老师,哪个地方它是空置针呢?首先问。这个。Link list是不是已经六过了,它不可能是。就是这个家伙,不可能是空的。
17:00
那谁是空的呢?哎,大家想一想,你这个地方是一个数组吧。你是不是你这数字你虽然不是空的,但是你里面的,你里面这个元素是不是全是空的呀。这个大家能理解吧,你看啊,我先告诉大家哪个是空的,其实。这个是空的。为什么呢?因为你相当于创建一个数组,数组里面的元素在你没有赋值的时候,是不是相当于这样感一种感觉就是你的的确确。就说你你的的确确是,呃有诶你比如这个你的的确确创建一个这个东西创建起来了,但是里面的这个元素一个都没有,其实就现在你现在现在是这样一个情况。是这样一个情况吧,根本就没东西。你们Java里面应该是学过这个东西的啦。肯定不行,那同学们想一想,是不是你应该想办法先给你家把这七个溜一把才行啊,怎么溜呢?大家都知道我们SC里面它的主方法的,它的这个就这里面包含的代码是不是会直接直接放到这个主构造器里面去啊,所以直接在这初始化就行了。
18:16
初始化。我们的。这个链表的各个什么呀元素。能理解好,那现在就简单了,For循环I。走,从00UNTIL。谁呀塞?是这个道理吧,然后你去做一件事情,做件什么事情呢?就employ I等于六一个employee。List。大家知道这在做什么事吗?你没有,这句话肯定是个空指针,现在我给每一个是不是就溜了一下,只是只是只是这里面这个还是空的啊,就是你这个没说,就现在你已经有真正的linked list了,我们再来跑一遍。
19:03
再来跑一遍,我们看看空子针一场,嗨,有没有啊,各位爱的我加一个一吧,宋江。走人。还有问题吗?没有问题。没问题,好,现在我们把这个list也给大家写一下。看看能不能把这写完好把这个写完,我们就把这个笔记做一个这个总结啊,呃,现在呢,看可以看到,呃,添加咱们没有问题了。Case。Case,如果它是一个list,那这个就简单啊,同学们,我们就直接调用。哈希table里面的历史的方法。对吧,OK,来各位我们跑一跑数据。好的,呃,那么现在呢,我们上来过后二话不说,我先直接历史的看看什么后果。是不是链表为空啊,为什么有这么多打这么多这么多句话呀,有七条是不是最好我们把这个链表的这个编号打出来,会好好看一点,是不是好我们这样子做啊,为了呃这个好看呢,我把链表的这个编号打出来。
20:12
诶,在这里。这个链表的链表的编号,你这你看啊,这个link的历史,它是拿不到链链表的编号的。他也不知道自己是几号是吧?那怎么办呢?好,同学们,是不是我们在哈希table的时候,我们这个地方是知道它是第几条的,所我传过去就完了是吧,可以吧,没问题吧,所以我把这个I传进去。把这个把这个I传进去过后呢,我们就在稍稍的做一点改进就可以了,哪里呢,就在这个地方,我们来接一下。It,然后呢,我们说链,呃,DD这么多条链表。啊。为空,同样我们在输出这个信息,如果有信息,是不是也这样提示会比较好看一点来,各位我在这呢也来,就是在这个便利的时候也也也来,如果有数据,我这样写第几条,第几条链表,第多少第多少条链表。
21:18
啊,链表为空,那下面呢,我们这样写第这么多条。多条链表的信息的信息为好,打一个制表符,那下面呢,这个打完了后先不要去换行。不要去换行,然后呢,这打完了过后,下面有数据就噼里啪啦做了,然后这边呢,我们也来一个制表符,这样好看,整个整完了以后,他会打第二条链表,第二条链表呢,我们在这方来一个换行,看起来就比较漂亮了,来,再来走一把。好,同学们,现在这个链表打出来应该会比较好看一点了。来,首先我们来list。好,没有数据,现在我添加。
22:00
我先添加一个一号和二号用户。爱的一号。好,回车,宋江回车,我们来看list。同学们可以看到,在第一条列表里面已经有一个宋江了,我们再来加一个人爱的。好,我们再在第一条列表再加一个,比如说编号为八,八刚好,哈希过后呢,还是一好,比如说这叫武松。好回车回冲过后呢,我们再历史的一下,同学们看到它绝确实是坐落在第一条列表,我们再来加一个,看看它能不能闪出去,比如现在我们再加一个九号。九号九号,比如说是鲁智深啊。啊。比如说叫这个花荣啊花荣。花荣,好回车,我们再历史一下,同学们看到它的确是闪开了。这个效果就比较明显啊,看起来比较清晰,好同学们,那关于这个第一部分就是我们这个哈希表的这一个添加和显示,我们就先说到这儿,待会儿呢,我们再写这个查找,我先截段视频。
我来说两句