20172322 《程序设计与数据结构》第四周学习总结
教材学习内容总结
-
列表的分类:有序列表、无序列表、索引列表,一共三类。
- 有序列表:在其中添加一个元素时,元素会自动去寻找自己应该在的位置,而列表的顺序可以由编写者决定,每一个新加的元素的位置是固定的。
- 无序列表:无序列表中的元素按照使用者所决定的的方式排序,使用者可以在无序列表的任何位置添加元素并且将元素固定在该位置,但是他们也是有顺序的,只是这种顺序与元素本身无关。
- 索引列表:在Java集合API中所提供的列表类主要就是索引列表书上的
Course
、ProgramOfStudy
和POSTester
就是利用Java集合API中所提供索引列表实现的。而Josephus
也是索引列表的一个体现。
-
跟以往类似,同样是通过链表和数组分别实现列表,但是因为索引列表在Java集合API中已经存在,本章的主要内容讲述了如何利用链表和数组去实现有序列表和无序列表。同样的本章也提供了一个列表ADT里面的基本方法
removeFirst
removeLast
remove
first
last
contains
isEmpty
size
toString
用于实现列表的基本功能。- 数组实现列表基本功能:利用数组实现列表的操作比较简单,书上也给出了大部分操作,并且因为实现列表的操作和实验一的一些操作类似。值得一提的是
find
方法的巧妙利用,因为布尔值的整形意义正好代表着0和-1,所以在contains
操作中直接利用了这个0和-1返回布尔值。 - 数组实现有序列表:书上代码已经直接给出了实现方法,也为之后利用链表实现提供一定的参考。重点是,只有Comparable对象才能储存在有序列表表中。
- 数组实现无序列表:在中间插入的方法
addAfter
已经给出,最大的一个问题已经解决,注意该方法需要输入的两个元素前面一个才是插入的元素,但是其实可以自己更改。 - 链表实现列表基本功能:书上只提供了
remove
操作,但是该方法中提供的遍历整个列表的方法为之后实现contains
方法提供了帮助。 - 链表实现有序列表和无序列表:这一部分书上没有给出任何参考。
- 数组实现列表基本功能:利用数组实现列表的操作比较简单,书上也给出了大部分操作,并且因为实现列表的操作和实验一的一些操作类似。值得一提的是
教材学习中的问题和解决过程
- 问题一:本章的代码实在是有点多了…本章教材一共30页,代码内容占到了15页左右
- 问题一解决方案:在国庆假期中手都快要敲断了才敲完了这么多代码,代码量一下子就上去了。
- 问题二:本次的PP项目看似不多也就3个项目,但是在实际实现的时候却发现完成这三个项目需要完成7个PP项目…
- 问题二解决方案:其实我也是在编写第一个PP项目的测试类时才发现的,用数组实现列表的基本功能里没有添加元素...
- 问题三:
instantof
方法是用来干嘛的? - 问题三解决方案:参考百度百科——instantof,instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。
代码调试中的问题和解决过程
在实现的过程中也参考了部分网上的内容,内容来源:用链表实现3种类型的线性表(有序链表、无序链表、索引链表)
- 问题一:在编写利用数组实现列表基本功能
last
和removeLast
时在测试调用该方法后总是显示last
是null而removeLast
方法总是报错。 - 问题一解决方案:利用Debug方法单步调试,发现是因为数组的索引值是从0开始的,而我利用的删除和显示最后一个均让索引值等于了列表的长度,导致我所得到的是列表最后一个值的下一个,所以是null,所以会报错。
- 问题二:在编写
LinkedList
和LinkedOrderedList
后测试时,总是会抛出错误NullPointException
,但是利用DeBug单步调试时可以发现元素是已经添加到了列表之中。 - 问题二解决方案:经过多次的尝试和调试,发现
first
方法可以正常使用,便将first
方法和其他方法进行对比,发现问题的根源在于:我在写first
方法时令了一个新的变量front
它的存在作用与head
类似,也是整个链表的开头,但是在其他的方法中我将front
和head
混用了,导致整个链表的丢失。我将所有的front
和head
做了一个整合后解决了问题。 - 问题三:在测试
LinkedList
时发现方法first
和last
调取的值是一样的,均是列表的前端元素也就是first
的值。 - 问题三解决方案:返回查看
first
和last
的代码,发现当初写的时候我是直接复制粘贴的,应该准备之后改正却忘记了...便改了改...
LinearNode<T> last = head;
for (int i = 0; i<count-1;i++)
{
last = last.getNext();
}
return last.getElement();
代码托管“点这里跳转到码云”
上周考试错题总结
上周考试全对,没有错题。有两次考试....忘了
- 错题1:
- 理解:这里的top类似于链表中用于计数的count,并不是指的栈顶元素
- 错题2:
- 理解:多态的引用可以随时间的改变而改变引用。
- 错题3:
- 理解:眼瞎,没读懂是啥意思。
- 错题4:
- 理解:栈顶是前端。
结对及互评
- 博客中值得学习的或问题:
- 范雯琪同学的博客课本上的学习内容总结部分写得十分详细,值得学习。
- 每次看到范雯琪同学的博客自己都比较惭愧,实在是非常优秀,可想而知她在博客这一方面所做出的努力,我也非常想向她学习。
- 代码量其实可以直接点击查看本周的文件夹里的代码,会方便一些。
- 代码中值得学习的或问题:
- commit提交的解释清晰明了,我觉得我应该学习。
点评过的同学博客和代码
- 本周结对学习情况
-
结对学习内容
- 我们一起实现了本周需要实现的一些PP项目并且给互相讲述了其中的基本原理。
- 给我解释了一些错题中无法理解的问题,第一题就是她为我详细讲解的。
其他
- 感悟:最近一个月所学习的内容主要就是对链表和数组的一些深入实践,无论是栈、队列还是本次的链表,基本的实现方法都是类似的,基础打好了遇到的困难都不是太多。
课本单词
(本部分用于收集本章节后的生词)
- Ordered List:有序列表
- Unordered List:无序列表
- Indexed List:索引列表
- natural ordering:自然排序
- selialization:串行化
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/5000 | 2/2 | 8/8 | 认真学习!积极向上 |
第二周 | 812/812 | 1/3 | 22/30 | |
第三周 | 814/1626 | 1/4 | 20/50 | |
第四周 | 1386/3012 | 2/6 | 20/70 | 愉快的国庆节就要结束了... |
-
计划学习时间:20小时
-
实际学习时间:20小时
-
改进情况:在国庆假期中愉快的学习Java。