20172311《程序设计与数据结构》第四周学习总结
教材学习内容总结
第六章 列表
- 列表可以使用链表或数组来实现
- 队和栈的元素只能在末端添加和删除,而列表集合更一般化,可以在列表的中间和末端添加和删除元素
- 列表可以分为有序列表、无序列表和索引列表
- 有序列表往列表添加新元素,就要查找新元素相对于所有已有元素的正确排序
- 无序列表中的元素按使用者所选择的任意方式排序
- 索引列表为它的元素维护一段连续的数字索引值
- 索引列表和数组的根本区别在于:索引列表的索引值总是连续的
- 为了使某个对象能使用串行化进行存储,其类必须实现Serializable,在Serializable接口中并没有任何方法,它只是表明该对象可以转换为串行化表示形式
- 索引列表特有的操作,可以利用其索引来很好地使用引用元素
- 只有Comparable对象才能存储在有序列表中
- 无序列表的aadAfter方法必须首先找到目标元素,把更高索引处的元素平移以腾出空间,然后把新元素插入到目标元素的后面
- 列表之间的区别在于如何添加元素
- 接口可以用来派生其他接口,子接口包含父接口的所有抽象方法
- 接口名可以用来声明一个对象引用变量,一个接口引用可以用来引用实现了该接口的任意类的任意对象
- 接口允许我们创建多态引用,其中被调用的方法是基于被引用时的特定对象的
教材学习中的问题和解决过程
-
问题:为什么用数组实现列表时没有用环形数组,与用数组实现队列时有何区别?
-
问题解决方案:通过研读课本得知。首先对于非环形数组数组实现队列假定队列的首元素总是存储在数组的索引0处,由于队列处理会影响该集合的两端,因此在删除元素时,该策略要求移动元素,使得dequeue操作的复杂度为O(n),数组实现的操作选使得效率低,而把数组看做环形的,可以去除在队列的数组实现中把元素位移的需要。而对于使用数组实现列表,一般的列表也可以从两端添加和删除元素,但是它们还有从列表中间插入或删除元素,因此无法避免要移动元素,也可以使用环形数组方法,但是当从列表中间插入或者删除元素,仍然需要移动元素,因而使用环形数组就显得没有必要了
代码调试中的问题和解决过程
-
问题1:用数组实现的有序列表类在测试时出现如下错误:
报错代码如下:
-
问题1解决方案:刚开始我以为是我的数组实现的有序列表里的add方法有问题,经过单步调试发现是因为我既加入了int型对象,又加入了String型对象,而该add方法能够进行排序的前提是所有的添加对象都是可比较的同一类型的对象,改正过后的测试类及运行结果截图如下:
-
问题2:pp6.17运行测试类时发现contain方法含有空指针异常,运行结果如下:
错误contain方法如下:
-
问题2解决方案:经过单步调试发现是逻辑上的错误造成的,在判断是否含有时应该首先判断是否为空,初步修改后仍有空指针错误,报错代码如下:
再经单步调试发现同样是逻辑错误,在得到元素前首先应该判断是否为空,最终修改后正确的contain方法如下:
代码托管
上周考试错题总结
-
错题1:
-
理解:定义良好的接口掩盖了集合的实现
-
错题2:
-
理解:继承的变量和方法可以在派生类中使用,就好像它们是在本地声明的一样。
-
错题3:
-
理解:公共功能应该在合理的类层次结构中尽可能高而不是尽可能低,以最小化维护工作
-
错题4:
-
理解:实现基于数组的堆栈的最有效方法是将堆栈的底部而不是保持在数组的0位置
-
错题5:
-
理解:对象引用变量可用于创建链式结构
-
错题6:
-
理解:堆栈的链接实现从链表的front进行
结对及互评
- 本周结对学习情况
对课本上的诸多疑问点进行了讨论,同时对代码实现过程中遇到的一些问题也通过讨论得以解决,继续一起努力吧!
感想
遇到细节问题时不要毛躁,要冷静分析,慢慢寻找错误,有助于问题的解决!!!!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 4/4 | |
第二周 | 464/464 | 1/2 | 10/14 | 理解掌握了用数组和链表实现栈的方法 |
第三周 | 494/958 | 1/3 | 10/24 | 理解掌握了用数组和链表实现队列的方法 |
第四周 | 1629/2587 | 2/5 | 20/44 | 对用链表和数组实现列表进行了学习 |
-
计划学习时间:15小时
-
实际学习时间:20小时
-
改进情况:继续强化代码编写能力!!