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(映射)。
    并没有说集合是一种对象的,很奇怪...

【参考资料】
百度百科
TonyW的专栏

  • 问题3:书上提到了MagazineNode是个内部类,因此将该内部类中的数据声明为公有是合理的,那什么是内部类?为什么不放在外面?什么时候用内部类?

  • 问题3解决过程:
    a.定义:内部类(nested classes),面向对象程序设计中,可以在一个类的内部定义另一个类。

b.优点:

  • (1). 内部类对象可以访问创建它的对象的实现,包括私有数据;
  • (2). 内部类不为同一包的其他类所见,具有很好的封装性;
  • (3). 使用内部类可以很方便的编写程序(emmm,我也是这么觉得的,不用声明要调用某个类了);

c.为什么需要内部类:内部类方法可以访问该类定义所在的作用域的数据,包括私有的数据
内部类可以对同一个包中的其他类隐藏起来,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以可以实现多重继承

d.使用内部类最吸引人的原因是:
  每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。
比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。

【参考资料】
tony~博客小屋
百度百科

代码调试中的问题和解决过程

  • 问题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

参考资料

posted @ 2018-05-20 22:05  20172308周亚杰  阅读(264)  评论(0编辑  收藏  举报