20172303 2017-2018-2 《程序设计与数据结构》第10周学习总结

教材学习内容总结

1.集合

  • 定义:专门用于保存信息的对象。
  • 集合的同构和异构:
    • 同构:集合中保存的类型全部相同。
    • 异构:集合中可以保存全部的类型。

2.数据结构

  • 数据结构分类:
  • 动态数据结构:一个动态数据结构使用链来实现,它的大小规模可以随意增大减小。
    • 构建链表
      • 格式:
      class Node
      {
          int info;
          Node next;
      }
      
  • 线性数据结构
    • 队列(queue)
      • 采取先进先出的方式,使用于有等待特点的排列。
      • 方法摘要:
    • 堆栈(stack)
      • 采取先进后出的方式,使用于有叠加特点的排列。
      • 方法摘要:
  • 非线性数据结构
      • 由一个根节点和构成层次结构的多个节点(内部节点)组成
      • 特殊树——二叉树:二叉树的每个节点不能有超过两个的子节点


- 图
- 图没有初始入口点
- 在一个图中,从一个节点到另一个节点的连接边称边,边可以是双向的,也可以是单向的。
- 当事物间的关系比较复杂无法用正常的层次结构来表现时,图是一种很好的选择。
- 没找到示意图_(:з」∠)_

3.Java集合类API

  • 泛型:只一个集合所管理的对象的类型要在实例化给集合对象时才确定。

教材学习中的问题和解决过程

  • 问题1:arraylist和linkedlist的区别?
  • 问题1解决方案:通过查找得知:(1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。(2)对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。(3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。但这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList。因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。
  • 问题2:数据结构的划分好像和我们上课讲的不一样,那么数据结构究竟在java中有哪些方法?
  • 问题2解决方案:在查找过程中发现了一张类型很全的图,其中实线边框的是实现类,折线边框的是抽象类,而点线边框的是接口
  • (看了结对伙伴的博客后增加的问题)问题3:队列、树、图如何用代码来实现?
  • 问题3解决方法:
    • 队列。队列分为单队列和循环队列两种,单队列又可分为顺序队列和链式队列。单队列是一种常见的队列,每次添加元素时都会放到队尾,但单队列中偶尔会出现“假溢出”的情况,针对这种情况,就可以使用循环队列,重新从头开始添加,就像一个圆环一样,头尾相连。代码实现:java队列实现
    • 关于图的内容,看了一下张昊然同学给的网址,它主要讲的是如何用邻接表的方式来实现图的,而这篇博客其实还有一个下篇:数据结构--图 的JAVA实现(下),讲的是如何利用邻接表做一个有向无环图。而在上篇的博客中提到图有两种表示方法:邻接表和邻接矩阵,但该博客里只讲了一种方法,所以我又去查了另外一种方法:java中图的两种存储方式
    • 树。树的实现有两种方法,分别是以数组的形式和以链表的形式。
//数组形式(又称父节点表示法)
public class TreeNode {

    private Object mData;   //存储的数据
    private int mParent;   //父亲节点的下标

    public TreeNode(Object data, int parent) {
        mData = data;
        mParent = parent;
    }

    public Object getData() {
        return mData;
    }

    public void setData(Object data) {
        mData = data;
    }

    public int getParent() {
        return mParent;
    }

    public void setParent(int parent) {
        mParent = parent;
    }
}
public static void main(String[] args){
    TreeNode[] arrayTree = new TreeNode[10];
}
//链表形式
public class LinkedTreeNode {

    private Object mData;   //存储的数据
    private LinkedTreeNode mParent;   //父亲节点的下标
    private List<LinkedTreeNode> mChildNodeList;    //孩子节点的引用

    public LinkedTreeNode(Object data, LinkedTreeNode parent) {
        mData = data;
        mParent = parent;
    }

    public Object getData() {
        return mData;
    }

    public void setData(Object data) {
        mData = data;
    }

    public Object getParent() {
        return mParent;
    }

    public void setParent(LinkedTreeNode parent) {
        mParent = parent;
    }

    public List<LinkedTreeNode> getChild() {
        return mChildNodeList;
    }

    public void setChild(List<LinkedTreeNode> childList) {
        mChildNodeList = childList;
    }

}

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

  • 问题1:在运行PP13.3的驱动类时,输出的结果为null.
  • 问题1解决方案:使用DeBug进行调试发现,如果我设置的循环条件是list不为空的话,当它为空时才能跳出循环,而当它为空时,等于说原来指针后面的东西全部丢掉了,所以最后输出结果也为空。解决方法是又添加了一个指针pre,使pre=list,然后把所有原来是list的地方都改成pre,这样就避免了list变为空,程序也就能正常运行了。

代码托管

代码:

commit提交:

上周考试错题总结(正确为绿色,错误为红色)

  • 错题1:Assume infile is a BufferedReader for a textfile and that the textfile is empty. What is returned from the message infile.readLine( ); ?
    • A . 0
    • B . null
    • C . a special character known as the End-of-file marker (EOF)
    • D . none of the above, the message causes a NullPointerException to be thrown
    • E . none of the above, the message causes a EndOfFileException to be thrown
  • 原因及理解情况:当时查JDK的时候它的原话是“如果已到达流末尾,则返回 null”,所以觉得B不对应该是抛出一个错误。后来想了一下加入文件为空的话等于说它刚进去就达到了末尾,所以会返回“null”。
  • 错题2:If an exception arises in a catch statement, and the exception is of the type caught by the catch statement, then the catch statement catches the same exception. For instance, if the following catch statement first catches an ArithmeticException and, while executing, throws another ArithmeticException, it is able to catch the second ArithmeticException as well the first.
    catch (ArithmeticException ex)
    • A . true
    • B . false
  • 原因及理解情况:catch语句不会捕获从它自身内部抛出的异常,尽管catch语句可以在其中嵌套额外的try和catch语句。

结对及互评

点评模板

  • 博客中值得学习的或问题:
    • 优点:在看他的问题和解答时发现了很多自己之前其实也不清楚但是没发现的问题,而且他的问题解答都比较简明扼要,我结合他的问题又在自己的博客中进行了修改(已标注)除此之外发现自己的博客没有上传commit截图,现已添加。
    • 缺点:教材内容总结还是没有很大改进...内容还是过于简单。
  • 代码中值得学习的或问题:
    • 本周优点和缺点结合着说吧,看了一下PP项目,有些借鉴,但很好的一点是不是把代码直接复制过来,而是在看懂之后并加入了自己的理解,注释了很多。我听一个学长说过,真正做项目的时候是不可能完完全全自己把一个程序的所有代码都想出来的,总会或多或少有一些借鉴,所以说借鉴不是坏事,重要的是学会所借鉴的内容中所使用的方法和思想。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172322
    • 结对学习内容
      • 共同讨论了书上的MagzineList类,询问了老师,真正理解了代码的含义。
      • 帮助张昊然同学解决了PP9.1的问题,提供了PP13.3当中使用链表实现选择排序的思路。

其他(感悟、思考等,可选)

  • 最近看完了一本书,里面的主角的一句话我很喜欢,感觉对待java学习、对待其他学业学习、对待人生,都应该有这种态度:珍惜天赋,保持悲悯。这里的“悲悯”我觉得可以理解为是一种谦虚,同样是一种包容,还是一种求真和探索。个人认为在java方面自己是一点天赋都没有的,但依旧要保持这种“悲悯”的心态去努力地求学。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 120/120 1/1 9/9
第二周 246/366 1/2 9/18
第三周 785/1121 2/4 15/33
第四周 615/1736 1/5 20/53
第五周 1409/2645 1/6 24/77
第六周 561/3206 1/7 20/97 再次搞清了一些自己有点含糊不清的概念
第七周 63/3269 1/8 15/112
第八周 2476/5745 3/11 90/201
第九周 824/6595 1/12 20/221
第十周 919/7514 2/14 20/241
  • 计划学习时间:20小时

  • 实际学习时间:20小时

  • 改进情况:很高兴最近的java学习能保持在一个稳定的时间长度内,我觉得这说明了我的学习方法终于成熟了。

参考资料

posted @ 2018-05-19 22:52  框框框  阅读(625)  评论(4编辑  收藏  举报