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元素
修改之后的运行结果如图:

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

这里的代码参考了余坤澎同学的代码,这个代码先对课程进行了比较,通过1,-1来标记课程的大小关系,在课程相等的条件下,又通过比较课程号返回1,-1标记大小,从而达到了题目要求;然后就是题目要求的课程列表的维护
问题2解决过程:课程列表的维护应该就是用一些相关的添加,删除,替换等方法来进行操作;
但是看到题目前面的要求,应该还是要对列表进行排序,用那个重写的接口方法,代码如图:

这是一开始写的,先新建了几个course对象存储相关数据,然后逐条放进列表;然后就是一个简单的排序过程,这个过程存在了很多问题:
- 首先,我为了体现维护列表的方法,用了replace方法,但是实际上没有中间变量的话,直接替代已经导致了已有的变量丢失
- 然后,我是直接将course变量存进了列表里,然后对course变量进行一系列交换操作,输出列表,但实际上这些交换操作对列表一点影响也没有只是变量间的交换,从输出结果上也能看到,输出的顺序就是* 我当时添加的顺序
- 最后就是,这个交换的操作太直接了,数据变量再多一个就够我排一会了
最终的代码如图:

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

又添加了一些course的方法以验证列表的可维护
本周错题
无
代码托管

结对及互评
博客中值得学习的或问题:
- 侯泽洋同学的博客排版工整,界面很美观
- 问题总结做得很全面
- 对于书上的疑惑总会想办法解决它,这种探索的精神值得我去学习
代码中值得学习的或问题:
- 对于编程的编写总能找到角度去解决
本周结对学习情况
- 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 |
20172308《Java软件结构与数据结构》第四周学习总结的更多相关文章
- 20172328 2018-2019《Java软件结构与数据结构》第四周学习总结
20172328 2018-2019<Java软件结构与数据结构>第四周学习总结 概述 Generalization 本周学习了第六章·列表,主要让我们认识列表以及分析各种列表实现. 教材 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第四周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第四周学习总结 教材学习内容总结 本周内容主要为书第六章内容: 列表 有序列表(元素按照元素内在特性进行排序) 无序 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第四周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第四周学习总结 经过这样一个国庆节的假期,心中只有一个想法,这个国庆假期放的,不如不放呢!! 教材学习内容总结 < ...
- 2018-2019-20172321 《Java软件结构与数据结构》第四周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第四周学习总结 教材学习内容总结 第六章 6.1列表集合 列表集合是一种概念性表示法,其思想是使事物以线性列表的方式进行 ...
- 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结
20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...
- 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
20172328 2018-2019<Java软件结构与数据结构>第六周学习总结 概述 Generalization 本周学习了第十章:非线性集合与数据结构--树.主要讨论了树的使用和实现 ...
- 20172328 2018-2019《Java软件结构与数据结构》第七周学习总结
20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和 ...
- 20172328 2018-2019《Java软件结构与数据结构》第八周学习总结
20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第五周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 <Java软件结构与数据结构>第九章-排序与查找 一.查找 1.查找概念简 ...
随机推荐
- angular.module()参数问题
var app = angular.module('myApp', []); 第二个参数是依赖的模块,因为这里不需要依赖其它模块,因此为空,但是[]不能省略.
- vue-router基本概念及使用
index.html: <!DOCTYPE html> <html> <head> <title></title> <meta cha ...
- 启动MyEclipse8.5时未响应
错误原因: MyEclipse在进行编译时被强行关闭,就会编译内容出错. 解决方法: 1. 换个工作空间. 2. 寻找到工作空间那,访问到H:\javaWork5\.metadata\.plug ...
- Git与GitHub学习笔记(二)提交的一些笔记
1.合并分支的使用一定要切换到master分支上去合并:git merge company2.切换分支的时候一定要提交干净本地分支的代码,才可以切换分支,否则提示错误信息: 3.这时候我们做的就是提交 ...
- asp.net将ppt文档转换成pdf
一.添加引用 using Microsoft.Office.Core;using Microsoft.Office.Interop.PowerPoint; 二.转换方法 C# 代码 复制 // ...
- PHP复制文件夹及文件夹内的文件
//1.取被复制的文件夹的名字://2.写出新的文件夹的名字://3.调用此函数,将旧.新文件夹名字作为参数传递://4.如需复制文件夹内的文件,第三个参数传1,否则传0: public functi ...
- HDU 1867 A + B for you again 字符匹配
解题报告:给你两个字符串,让你连接起来,没有前后顺序,要求是长度最短优先,其次是字典序最小.这题我用的是KMP,做两次匹配,分别把第一次跟第二次输入的字符串放前面,然后比较两次得到的字符窜的长度和字典 ...
- git与代码托管工具
1.git初识 git是一个版本管理工具,用来管理项目的不同的版本,记录下不同的提交记录,git还可以构建不同的分支,用来给不同的人来推送使用. 推荐的git教程:https://www.cnblog ...
- .NET 的 WCF 和 WebService 有什么区别?(转载)
[0]问题: WCF与 Web Service的区别是什么? 和ASP.NET Web Service有什么关系? WCF与ASP.NET Web Service的区别是什么? 这是很多.NET开发人 ...
- ps命令实用方法.ps -l ps -L详解
一.统计sleep状态的进程. c233 plugins # ps -elf|head -1F S UID PID PPID C PRI NI ADDR SZ WCHA ...