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



2018年学习总结博客总目录:第一周 第二周 第三周 第四周


教材学习内容总结

第六章 列表

1.列表是对象的有序集合,在 List 界面中定义。 List 接口表示集合框架中的列表。列表可以具有重复的元素。并且我们可以在列表中存储多个空值。

2.列表集合 是一种概念性的表示方法,其思想是使事物以线性列表的方式进行组织,就像栈和队列一样,列表也可以使用数组和链表来实现。列表集合没有内在的容量大小,它可以随着需要而增大。列表集合更一般化,可以在列表的中间和末端添加和删除元素。

3.列表可以分为有序列表、无序列表、索引列表。

  • 有序列表,是基于列表中元素的某种特性的。列表基于某个关键值排序,对于已经添加到有序列表中的元素,只要给定了元素的关键值,同时列表已经定义了元素的所有关键值,那么它在列表中就有一个固定的位置。
  • 无序列表,各个元素的位置并不基于元素的任何内在特性,但是不要被名字误导, 无序列表中的元素是按照特殊顺序放置,只是这种顺序与元素本身无关,列表的使用者会决定列表的顺序。
  • 索引列表,与无序列表类似,索引列表的各个元素之间也不存在能够决定他们在列表中顺序的内在关系。列表的使用者决定了元素的顺序,不过,除此之外,其每个元素都能够从一个数字索引值得到引用,该索引值从列表的头开始从0连续增加直到列表末端。当列表发生改变,索引值就响应的调整以保持顺序和连续性。索引列表为他的元素维护一段连续的数字索引值。

4.列表的总体UML图

5.Java集合API中的列表所定义的一些基本操作,见下表

操作 描述
add 向列表末端添加一个元素
add(int index, E element) 在列表的指定位置插入指定元素
get(int index) 返回列表中指定位置的元素
remove(int index) 移除列表中指定位置的元素
remove(Object o) 从此列表中移除第一次出现的指定元素(如果存在)
set(int index, E element) 用指定元素替换列表中指定位置的元素
size() 返回列表中的元素数

6.①无序列表的使用:学习计划;②索引列表的使用:Josephus问题。

7.列表ADT
(1)列表的常见操作

操作 描述
removeFirst 从列表中删除第一个元素
removeLast 从列表中删除最后一个元素
remove 从列表中删除某个元素
first 查看位于列表前端的元素
last 查看位于列表末端的元素
isEmpty 确定列表是否为空
size 确定列表中的元素数

(2)接口ListADT的代码

import java.util.Iterator;

public interface ListADT<T> extends Iterable<T>
{

    public T removeFirst();

    public T removeLast();

    public T remove(T element);

    public T first();

    public T last();

    public boolean contains(T target);

    public boolean isEmpty();

    public int size();

    public Iterator<T> iterator();

    public String toString();
}

(3)有序列表接口类代码

public interface OrderedListADT<T> extends ListADT<T>
{

    public void add(T element);
}

(4)无序列表接口类代码

public interface UnorderedListADT<T> extends ListADT<T>
{

    public void addToFront(T element);  

    public void addToRear(T element); 

    public void addAfter(T element, T target);
}

8.使用数组实现列表

  • ArrayList类的头和类级代码:
public abstract class ArrayList<T> implements ListADT<T>, Iterable<T>
{
    private final static int DEFAULT_CAPACITY = 100;
    private final static int NOT_FOUND = -1;

    protected int rear;
    protected T[] list;
    protected int modCount;

    public ArrayList()
    {
        this(DEFAULT_CAPACITY);
    }

    public ArrayList(int initialCapacity)
    {
        rear = 0;
        list = (T[])(new Object[initialCapacity]);
        modCount = 0;
    }
}
  • remove操作及find方法
public T remove(T element)
    {
        T result;
        int index = find(element);

        if (index == NOT_FOUND)
            throw new ElementNotFoundException("ArrayList");

        result = list[index];
        rear--;

        // shift the appropriate elements
        for (int scan=index; scan < rear; scan++)
            list[scan] = list[scan+1];

        list[rear] = null;
        modCount++;

        return result;
    }
private int find(T target)
    {
        int scan = 0;
        int result = NOT_FOUND;

        if (!isEmpty())
            while (result == NOT_FOUND && scan < rear)
                if (target.equals(list[scan]))
                    result = scan;
                else
                    scan++;

        return result;
    }
  • contains操作:这里也将调用find方法
public boolean contains(T target)
    {
        return (find(target) != NOT_FOUND);
    }
  • 添加操作

    • 有序列表的add操作
    public void add(T element)
      {
          if (!(element instanceof Comparable))
              throw new NonComparableElementException("OrderedList");
    
          Comparable<T> comparableElement = (Comparable<T>)element;
    
          if (size() == list.length)
              expandCapacity();
    
          int scan = 0;  
    
          // find the insertion location
          while (scan < rear && comparableElement.compareTo(list[scan]) > 0)
              scan++;
    
          // shift existing elements up one
          for (int shift=rear; shift > scan; shift--)
              list[shift] = list[shift-1];
    
          // insert element
          list[scan] = element;
          rear++;
          modCount++;
      }
    • 无序列表的addAfter操作
    public void addAfter(T element, T target)
      {
          if (size() == list.length)
              expandCapacity();
    
          int scan = 0;
    
          // find the insertion point
          while (scan < rear && !target.equals(list[scan]))
              scan++;
    
          if (scan == rear)
              throw new ElementNotFoundException("UnorderedList");
    
          scan++;
    
          // shift elements up one
          for (int shift=rear; shift > scan; shift--)
              list[shift] = list[shift-1];
    
          // insert element
          list[scan] = element;
          rear++;
          modCount++;
      }

9.使用链表实现列表

  • LinkedList类的类头、类级函数和构造函数:
public abstract class LinkedList<T> implements ListADT<T>, Iterable<T>
{
    protected int count;
    protected LinearNode<T> head, tail;
    protected int modCount;

    /**
     * Creates an empty list.
     */
    public LinkedList()
    {
        count = 0;
        head = tail = null;
        modCount = 0;
    }
}
  • remove操作
public T remove(T targetElement) throws EmptyCollectionException,
         ElementNotFoundException
    {
        if (isEmpty())
            throw new EmptyCollectionException("LinkedList");

        boolean found = false;
        LinearNode<T> previous = null;
        LinearNode<T> current = head;

        while (current != null && !found)
            if (targetElement.equals(current.getElement()))
                found = true;
            else
            {
                previous = current;
                current = current.getNext();
            }

        if (!found)
            throw new ElementNotFoundException("LinkedList");

        if (size() == 1)  // only one element in the list
            head = tail = null;
        else if (current.equals(head))  // target is at the head
            head = current.getNext();
        else if (current.equals(tail))  // target is at the tail
        {
            tail = previous;
            tail.setNext(null);
        }
        else  // target is in the middle
            previous.setNext(current.getNext());

        count--;
        modCount++;

        return current.getElement();
    }

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

  • 问题1:对于书上97页所提及的“Serializable接口是为了某个对象能使用串行化进行存储”,什么是串行化,又是怎么实现的?
  • 问题1解决方案:(1)Java串行化即Java序列化,一个对象随着创建而存在,随着程序结束而结束。那如果我要保存一个对象的状态呢?Java序列化能够将对象的状态写入byte流存储起来,也从其他地方将byte流读取出来,重新构造一个新的对象。这种机制允许你将对象通过网络进行传播,并且可以随时把对象持久化到数据库、文件系统中。简而言之,序列化就是将一个对象的状态保存起来,而反序列化就是将已经保存的流对象恢复成原来的对象。
    (2)如何实现序列化?
    实现序列化有一个条件,即实现序列化的类必须实现java.io.Serializable接口。之后可以利用ObjectInputStream的readOjbect()方法和OjbectOutputStream的writeObject()方法进行对象的读和写,即反序列化和序列化。

a) Java对象:在java中要想使一个java对象可以实现序列化与反序列化,必须让该类实现java.io.Serializable接口,java.io.Serializable接口定义如下:

publicinterface Serializable {

}

b) 序列化主要依赖java.io.ObjectOutputStream类,该类对java.io.FileOutputStream进一步做了封装,这里主要使用ObjectOutputStream类的writeObject()方法实现序列化功能

/**

     *将对象序列化到磁盘文件中

     *@paramo

     *@throwsException

     */

    publicstaticvoid writeObject(Object o) throws Exception{

       File f=new File("d:""user.tmp");

       if(f.exists()){

           f.delete();

       }

       FileOutputStream os=new FileOutputStream(f);

       //ObjectOutputStream 核心类

       ObjectOutputStream oos=new ObjectOutputStream(os);

       oos.writeObject(o);

       oos.close();

       os.close();

    }

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

  • 问题1:Josephus问题中的代码中numPeople,skip分别代表什么意思?
  • 问题1解决方案:把书上代码敲入后,运行了两次,去对比书上给出的那个7个元素的结果,

    这时便可理解numPeople代表总的人数,而skip代表的则是每隔几个元素删除一个元素,每3个人在这里实际上是每隔2个人。

代码托管

上周代码行数为8867行,现在为10335行,本周共1468行,

上周考试错题总结

  • 上周没有错题

结对及互评

  • 本周结对学习情况

    • 20172308
    • 博客中值得学习的或问题: 博客中代码问题解决过程记录较详细,可适当添加教材内容总结。
    • 结对学习内容:学习第6章内容——列表

其他(感悟、思考等)

感悟

  • 假期学习时间有点短,2号完成了实验博客,学习了本章内容,之后几天做的内容不多,下周要投入多的时间。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 15/15
第二周 572/572 1/2 16/31
第三周 612/1184 1/3 13/44
第四周 1468/2652 2/5 13/57

参考资料

原文地址:https://www.cnblogs.com/hzy0628/p/9737321.html

时间: 2024-10-01 05:19:53

20172302 《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)就是具有两个附加属性的一颗二叉树: 第一点:它是一颗完全二叉树 ,即叶子节点都在最后一层靠左侧

20172302 《Java软件结构与数据结构》实验二:树实验报告

课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月5日 必修/选修: 必修 实验内容 (1)参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder:用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息 (2)基于Linked

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