20172308《程序设计与数据结构》第十周学习总结
20172308 2017-2018-2 《Java程序设计》第十周学习总结
教材学习内容总结
1.集合:
a.定义:一种对象,类似于保存其他对象的存储库(并且提供增添,删除等管理所保存元素的服务)
b.同构:集合保存的对象类型全部相同
异构:集合可以保存各种类型的对象
c.特点:保存对象的基础数据结构可以用各种技术实现,如接口
2.数据结构
a.动态表示:用“链”来实现,利用对象引用作为连接对象间的链
优势:相比与数组事先必须固定好需要的存储空间,数据结构的动态表示可以根据需要增长和收缩
b.动态结构:
c.线性数据结构
(1)队列:类似于列表,但存取方式为“先进先出”
(2)堆栈:类似于队列,但存取方式为“后进先出”
d.非线性数据结构
(1)树:有根节点
二叉树:每个节点不能有超过两个的子节点
(2)图:没有类似于根节点那样的初始入口点
便可以有单向或双向
3.泛型
a.定义:一个集合所管理的对象类型是在实例化该集合对象时才确定
b.建立集合时,如果没有指定该集合中可能存放的对象类型,则默认为object类型,即该集合可以存放任何类型的对象
教材学习中的问题和解决过程
-
问题1:书上说:“集合的一个重要之处是,集合可以用各种方式实现,即保存对象的基础数据可以用各种技术实现”,如何理解?
-
问题1解决过程:结合百度的资料和书上的提示,大概理解是这样的:Java集合不能存放基本数据类型,只存放对象的引用。而集合的不同类型就可以用对应数据类型的方法对其进行操作
【参考资料】
ZhuMin_ChosenOne的博客
guanglihuan的专栏
-
问题2:书上说:“集合是一种对象”,而我记得老师上课时说它是一种类。
-
问题2解决过程:百度到的一些资料都说的是“集合类”。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用
集合类型主要有3种:set(集)、list(列表)和map(映射)。
并没有说集合是一种对象的,很奇怪...
-
问题3:书上提到了MagazineNode是个内部类,因此将该内部类中的数据声明为公有是合理的,那什么是内部类?为什么不放在外面?什么时候用内部类?
-
问题3解决过程:
a.定义:内部类(nested classes),面向对象程序设计中,可以在一个类的内部定义另一个类。
b.优点:
- (1). 内部类对象可以访问创建它的对象的实现,包括私有数据;
- (2). 内部类不为同一包的其他类所见,具有很好的封装性;
- (3). 使用内部类可以很方便的编写程序(emmm,我也是这么觉得的,不用声明要调用某个类了);
c.为什么需要内部类:内部类方法可以访问该类定义所在的作用域的数据,包括私有的数据
内部类可以对同一个包中的其他类隐藏起来,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以可以实现多重继承
d.使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。
比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。
代码调试中的问题和解决过程
-
问题1:PP13.1,原来储存在数组里的DVD集,现在要求用链表进行维护,即通过链表进行删改储存的DVD集
-
问题1解决过程:
结合书上的例题,我的编程思路是:
首先,用链表的其中一点好处就是,不受数组事先声明好的内存空间限制。原来的程序写了一个increaseSize()方法,在add方法里调用,使得DVD片数超过数组长度时能够调用这个方法来扩大数组长度。而用链表维护就不用专门写这个方法了,DVD集的存储个数是动态的。
所以,编程的主要体现就是不利用数组。
在编译过程中出现了如图的不是预期的结果:
程序中写了三个addDVD方法,按道理应该输出不同的内容,但结果只输出了第三个add的内容,检查了一下add方法的编写,应该没有错误,然后猜测应该是toString写错了,代码如图:
原先的collection是一个数组对象,然后通过for循环来遍历数组内元素并打印,但是更改以后循环就会出现上图的错误
更改toString方法以后,代码如下:
通过链表来将每一个节点的元素打印出来,就解决了问题。
代码托管
上周考试错题总结
-
错题1:
-
错题1解析:该方法将字符串a中的每个字符与char b进行比较,直到我到达字符串a的长度。1被添加到每个匹配的返回值中。
-
错题2:
-
错题2解析:这个方法递归地调用它自己,n是它的原始值的一半。如果n从16开始,第二个调用有n = 8,第三个有n = 4,第4个有n = 2,第5个和最后一个调用有n = 1。如果n从32开始,它会增加一个额外的调用。如果我们再次加倍,它只会增加一个递归调用。这是一个log2(n)行为。
-
错题3:
-
错题3解析:为了简单起见,数学通常递归地定义函数。这种问法让我怀疑其它项也有正确的可能性,但说到底还是对递归的作用和意义不是真正理解。
-
错题4:
-
错题4解析:如果调用x< 0,则原始方法会导致无限递归,但如果使用任何x>= 0,则可以正常工作。对于新的基本情况,如果使用任何参数>= 1,该方法现在可以正常工作,但如果参数< 1,则会导致无限递归。所以sum(0)和之前的是不同的。本题出错的原因是对递归的代码没有认真分析,两种情况下,递归的条件不同。
-
错题5:
-
错题5解析:递归定义不包含基本情况,因此所有int值列表都将无限长!首先这题的题目看不懂,list后面的下划线不知道是什么意思,完全看不出哪里有递归的影子。而且没有百度到。
-
错题6:
-
错题6解析:递归和迭代都是重复的形式。使用递归或迭代的重复使用是一种风格、味道、有时是效率,有时是方便。但它们在计算上是等价的——每一个都可以被另一个取代。因为书上只提到了,递归都可以用循环代替,并没有说二者可以互换,百度上也没有肯定的说法,所以就选了错误,反映出自己的思维不够发散
-
错题7:
-
错题7解析:添加方法适用于大于或等于零的ints;但如果b小于0,它就失败了。跟前面一题一样,看不懂题目,不知道问号是什么意思,也许百度一下就会做了吧,但是时间有限
-
错题8:
-
错题8解析:乘法只是重复的加法。这个方法只是重复添加a, b乘以。只要a和b都是非负的,这个方法就没问题。跟上一题一样。
结对及互评
-
博客中值得学习的或问题:
- 侯泽洋同学的博客排版工整,界面很美观
- 问题总结做得很全面
- 对于书上的疑惑总会想办法解决它,这种探索的精神值得我去学习
-
代码中值得学习的或问题:
- 对于编程的编写总能找到角度去解决
-
本周结对学习情况
- 20172302
- 结对学习内容
- 第十三章内容:集合
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 309/309 | 1/1 | 20/20 | |
第二周 | 269/578 | 1/2 | 18/38 | |
第三周 | 236/776 | 1/3 | 22/60 | |
第四周 | 507/1283 | 2/5 | 30/90 | |
第五周 | 631/1914 | 1/6 | 30/120 | |
第六周 | 529/2443 | 1/7 | 25/145 | |
第七周 | 515/2958 | 1/8 | 25/170 | |
第八周 | 1128/4086 | 2/10 | 50/220 | |
第九周 | 1241/5327 | 1/11 | 15/235 | |
第十周 | 1852/7179 | 1/12 | 10/245 |