20172308《Java软件结构与数据结构》第四周学习总结

教材学习内容总结

第 6 章 列表

一. 列表集合

  • 列表集合:一种概念性表示法,思想是使事物以线性列表的方式进行组织
  • 特点:
    列表集合没有内在的容量大小,它可以随着需要而增大
    列表集合更具一般化,可以在列表的中间和末端添加和删除元素
    列表也可以使用链表或数组实现
  • 类型:
    有序列表:元素按照元素的某种内在特性进行排序
    无序列表:元素间不具有内在顺序,元素按照它们在列表中的位置排序
    索引列表:其元素可以用数字索引来引用(顺序由使用者决定)

二. Java API没有任何类能直接实现以上描述的有序列表

三. 索引列表使用示例:Josephus问题

  • Josephus问题:当列表中的事件不是按顺序取出而是按每隔i个元素取出,直到一个不剩时,如何找到这些事件的顺序
  • 实现原理:初始列表存储在一个索引列表中,通过计算要删除的列表中下一个索引位置,就可以一次一个地从列表中删除元素
  • 实现难度:索引列表的“崩塌”,每删除一个元素之后,下一个要删除的元素索引值会变化

四. 列表ADT

  • 列表添加元素:
    有序列表添加元素的位置取决于其键值
    无序列表可以添加元素到列表的前端、末端、中间
    索引列表添加或删除元素到列表中间会引起列表更大索引处元素上移以为新元素提供空间,或下移以消除删除元素后留下的空隙;也可添加元素以覆盖某索引处元素,且不会导致其他元素移位

五. 使用数组实现列表

  • 实现原理:类似于数组实现栈,把列表的一端固定在索引0处,并按需要平移元素
  • 为什么不采用其它方法?
    列表需要在两端插入删除,队列不行
    环形数组也可以,但还是要平移元素

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

问题1:索引列表为它的元素维护一段连续的数字索引值,是什么意思?索引列表与数组的区别在哪里?

问题1解析:其实早在刚学数组的时候就在想,如果数组里删掉了某个元素或者让它等于null,那这个位置就不会动吗?有没有那种数组删掉某个位置上的元素自动补全空位的这种数组呢?今天看完就知道了这种数组就是索引列表,这样“崩塌”式的列表可以保证列表内元素是连续的,,,但是,这有什么用呢?

我甚至没能百度到索引列表的相关介绍。。。

【参考资料】

问题2:在写到PP6.17时,需要了解Serializable是什么

问题2解析:

Serializable接口中一个成员函数或者成员变量也没有。那这个接口的作用是什么呢?看了一些博客之后,知道这个接口的作用是实现序列化

  • 序列化:对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量,不是方法)保存下来,并且可以在需要时再将对象恢复。虽然你可以用你自己的各种各样的方法来保存对象的状态,但是Java给你提供一种应该比你自己的好的保存对象状态的机制,那就是序列化。
  • Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(系列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)
  • 系列化的用途
    想把的内存中的对象状态保存到一个文件中或者数据库中时候
    想把对象通过网络进行传播的时候

【参考资料】
Serializable
Brenda

代码运行中的问题及解决过程

问题1:在用System.out.println()输出列表的时候输出的结果是一串地址,如图:

问题1解决过程:百度之后知道,用它直接输出一个类的对象的时候,会调用这个类的toString()方法,这个方法有些类是覆盖了的,比如String,Integer。自己写的类没有覆盖这个方法的话就是继承Object类的这个方法,所以打印出来的结果跟自己想要的格式不一样,所以需要自己重写toString方法;

重写代码:

public String toString() {
        String returnString = "";
        for(T strTemp:list){
            if (strTemp == null)
                break;
            returnString += strTemp+" ";
        }
        return returnString;
    }

将数组内的元素都打印出来,而不输出null元素

修改之后的运行结果如图:

【参考资料】
百度知道
CSDN

问题2:在PP6.17中,要实现Comparable接口,然后重写compareTo方法能够按照课程、课程号简单排序,代码如图:


这里的代码参考了余坤澎同学的代码,这个代码先对课程进行了比较,通过1,-1来标记课程的大小关系,在课程相等的条件下,又通过比较课程号返回1,-1标记大小,从而达到了题目要求;然后就是题目要求的课程列表的维护

问题2解决过程:课程列表的维护应该就是用一些相关的添加,删除,替换等方法来进行操作;

但是看到题目前面的要求,应该还是要对列表进行排序,用那个重写的接口方法,代码如图:

这是一开始写的,先新建了几个course对象存储相关数据,然后逐条放进列表;然后就是一个简单的排序过程,这个过程存在了很多问题:

  • 首先,我为了体现维护列表的方法,用了replace方法,但是实际上没有中间变量的话,直接替代已经导致了已有的变量丢失
  • 然后,我是直接将course变量存进了列表里,然后对course变量进行一系列交换操作,输出列表,但实际上这些交换操作对列表一点影响也没有只是变量间的交换,从输出结果上也能看到,输出的顺序就是* 我当时添加的顺序
  • 最后就是,这个交换的操作太直接了,数据变量再多一个就够我排一会了

最终的代码如图:

找了个中间变量,防止数据丢失
关于排序的话,我觉得还是用索引列表方便找到每条数据并进行排序
最后的运行结果如图:

又添加了一些course的方法以验证列表的可维护

上周考试错题总结

  • 错题1:
  • 错题1解析:
  • 错题2:
  • 错题2解析:
  • 错题3:
  • 错题3解析:
  • 错题4:
  • 错题4解析:

代码托管

结对及互评

  • 博客中值得学习的或问题:

    • 侯泽洋同学的博客排版工整,界面很美观
    • 问题总结做得很全面
    • 对于书上的疑惑总会想办法解决它,这种探索的精神值得我去学习
  • 代码中值得学习的或问题:
    • 对于编程的编写总能找到角度去解决
  • 本周结对学习情况
    • 20172302
    • 结对学习内容
      • 第六章内容:列表

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 4/4
第二周 560/560 1/2 6/10
第三周 415/975 1/3 6/16
第四周 1055/2030 1/4 14/30

原文地址:https://www.cnblogs.com/zhouyajie/p/9747400.html

时间: 2024-10-08 01:05:01

20172308《Java软件结构与数据结构》第四周学习总结的相关文章

20172304 2018-2019《java软件结构与数据结构》 第一章 第二章学习总结

20172304 2018-2019<java软件结构与数据结构> 第一章 第二章学习总结 教材学习内容总结 第一章 概述 1.1软件质量: 高质量软件的几个特征: 正确性:软件在多大程度上满足其特定需求 可靠性:软件故障发生频率和危险程度 健壮性:出错情况下可以得到恰当处理的程度 可用性:用户学习和执行任务的难易程度 可维护性:对软件进行修改的难易程度 可重用性:软件组件可重用于其他软件系统开发的难易程度 可移植性:软件组件可以在多个计算机环境下使用的难易程度 运行效率:在不浪费资源的情况下

2018-2019-20172329 《Java软件结构与数据结构》第五周学习总结

2018-2019-20172329 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 <Java软件结构与数据结构>第九章-排序与查找 一.查找 1.查找概念简述: (1)查找3是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素.对其进行查找的项目组有时也称为查找组. (2)查找方式的分类:线性查找,二分查找. (3)查找所要完成的目标:尽可能高效的完成查找,从算法分析的角度而言,我们希望最小化比较操作的次数,通常,查找池里项目数

20172328 2018-2019《Java软件结构与数据结构》第六周学习总结

20172328 2018-2019<Java软件结构与数据结构>第六周学习总结 概述 Generalization 本周学习了第十章:非线性集合与数据结构--树.主要讨论了树的使用和实现,以及考察实现和使用树的实例. 教材学习内容总结 A summary of textbook 树(tree):树是一种非线性结构,其元素被组织成了一个层次结构.下面是树的术语,了解一下吧! 树有一个包含结点(node)和边(edge)的集构成,其中的元素被储存在这些结点中,边则将一个结点和另一个结点连接起来.

20172328 2018-2019《Java软件结构与数据结构》第七周学习总结

20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和各种二叉查找树实现,考察为二叉查找树添加和删除元素的算法以及维护平衡二叉查找树的算法 教材学习内容总结 A summary of textbook 二叉查找树(binary search tree):二叉树定义的扩展,一种带有附加属性的二叉树.附加属性是什么?树中的每个节点,其左孩子都要小于其父节点,而父节点

2018-2019-20172329 《Java软件结构与数据结构》第七周学习总结

2018-2019-20172329 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十一章-二叉查找树 一.概述 1.什么是二叉查找树:二叉查找树是一种带有附加属性的二叉树,即对树中的每个结点,其左孩子都要小于其父结点,而父结点又小于或等于其右孩子. 2.二叉查找树的定义是二叉树定义的扩展. 3.操作: 操作 描述 addElement 往树中添加一个元素 removeElement 从书中删除一个元素素 removeAllOccu

2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结

2018-2019-20172321 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 第11章 二叉查找树 一.概述 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子小于父节点,而父节点又小于等于其右孩子.如下图所示.根结点的左子树每个元素都小于80,右子树每个元素都大于80. 查找方法,要判定一个具体的目标是否存在于树中,需要沿着从根开始的路径,根据查找目标是小于还是大于当前结点的值,相应地转到当前结点的左子结点或右结点.最终或是找到目标元素,或是遇到路径的末端,后者意

2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结

2018-2019-20172329 <Java软件结构与数据结构>第八周学习总结 现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习啦,新的一周要加油!?? 教材学习内容总结 <Java软件结构与数据结构>第十二章-优先队列与堆 一.概述 1.什么是堆: 堆就是具有两个附加属性的一个二叉树. 堆分为小顶堆和大顶堆. 两个附加属性如下: (1)它是一颗完全树.(完全树:如果某树是平衡的,且底层所有叶子都位于树的左边,则认为该树是

20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(?°?°?)??就是堆.本章将讲解堆的链表实现and数组实现,以及往堆中添加元素或从堆中删除元素的算法:还将介绍对的一些用途,包括基本使用和优先队列. 教材学习内容总结 A summary of textbook 堆(heap)就是具有两个附加属性的一颗二叉树: 第一点:它是一颗完全二叉树 ,即叶子节点都在最后一层靠左侧

2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结

2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: 边由连接的顶点对来表示,如:(A,B),(C,D),表示两顶点之间有一条边. 无向图:与树类似,图也由结点和这些结点之间的连接构成.这些结点是顶点,而结点之间的链接是边.无向图是一种边为无序结点对的图.于是,记做(A,B)的边就意味着A与B之间有一条从两个方向都可以游历的连接.边记作(A,B)和记作(B,A

20172305 2018-2019-1 《Java软件结构与数据结构》第一周学习总结

20172305 2018-2019-1 <Java软件结构与数据结构>第一周学习总结 教材学习内容总结 本周内容主要为书第一章和第二章的内容: 第一章 软件质量: 正确性(软件达到特定需求的程度) 可靠性(软件发生故障的频率和危害程度) 健壮性(很好处理错误情况的情况) 可用性(用户在软件中掌握和运行任务的容易程度) 可维护性(软件进行修改的容易程度) 可重用性(软件组件可被其他软件系统开发使用的容易程度) 可移植性(软件组成可用于多种计算机环境中的容易程度) 运行效率(不浪费资源的情况下软