20172308《Java軟件結構與數據結構》第四周學習總結

教材學習內容總結

第 6 章 列表

一. 列表集合html

  • 列表集合:一種概念性表示法,思想是使事物以線性列表的方式進行組織
  • 特色:
    列表集合沒有內在的容量大小,它能夠隨着須要而增大
    列表集合更具通常化,能夠在列表的中間和末端添加和刪除元素
    列表也可使用鏈表或數組實現
  • 類型:
    有序列表:元素按照元素的某種內在特性進行排序
    無序列表:元素間不具備內在順序,元素按照它們在列表中的位置排序
    索引列表:其元素能夠用數字索引來引用(順序由使用者決定)

二. Java API沒有任何類能直接實現以上描述的有序列表前端

三. 索引列表使用示例:Josephus問題git

  • Josephus問題:當列表中的事件不是按順序取出而是按每隔i個元素取出,直到一個不剩時,如何找到這些事件的順序
  • 實現原理:初始列表存儲在一個索引列表中,經過計算要刪除的列表中下一個索引位置,就能夠一次一個地從列表中刪除元素
  • 實現難度:索引列表的「崩塌」,每刪除一個元素以後,下一個要刪除的元素索引值會變化

四. 列表ADT數據庫

  • 列表添加元素:
    有序列表添加元素的位置取決於其鍵值
    無序列表能夠添加元素到列表的前端、末端、中間
    索引列表添加或刪除元素到列表中間會引發列表更大索引處元素上移覺得新元素提供空間,或下移以消除刪除元素後留下的空隙;也可添加元素以覆蓋某索引處元素,且不會致使其餘元素移位

五. 使用數組實現列表編程

  • 實現原理:相似於數組實現棧,把列表的一端固定在索引0處,並按須要平移元素
  • 爲何不採用其它方法?
    列表須要在兩端插入刪除,隊列不行
    環形數組也能夠,但仍是要平移元素

教材學習中的問題和解決過程

問題1:索引列表爲它的元素維護一段連續的數字索引值,是什麼意思?索引列表與數組的區別在哪裏?

問題1解析:其實早在剛學數組的時候就在想,若是數組裏刪掉了某個元素或者讓它等於null,那這個位置就不會動嗎?有沒有那種數組刪掉某個位置上的元素自動補全空位的這種數組呢?今天看完就知道了這種數組就是索引列表,這樣「崩塌」式的列表能夠保證列表內元素是連續的,,,可是,這有什麼用呢?

我甚至沒能百度到索引列表的相關介紹。。。數組

【參考資料】網絡

問題2:在寫到PP6.17時,須要瞭解Serializable是什麼

問題2解析:

Serializable接口中一個成員函數或者成員變量也沒有。那這個接口的做用是什麼呢?看了一些博客以後,知道這個接口的做用是實現序列化函數

  • 序列化:對象的壽命一般隨着生成該對象的程序的終止而終止,有時候須要把在內存中的各類對象的狀態(也就是實例變量,不是方法)保存下來,而且能夠在須要時再將對象恢復。雖然你能夠用你本身的各類各樣的方法來保存對象的狀態,可是Java給你提供一種應該比你本身的好的保存對象狀態的機制,那就是序列化。學習

  • Java 序列化技術可使你將一個對象的狀態寫入一個Byte 流裏(系列化),而且能夠從其它地方把該Byte 流裏的數據讀出來(反序列化).net

  • 系列化的用途
    想把的內存中的對象狀態保存到一個文件中或者數據庫中時候
    想把對象經過網絡進行傳播的時候

【參考資料】
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的方法以驗證列表的可維護

本週錯題

代碼託管

結對及互評

  • 博客中值得學習的或問題:
    • 侯澤洋同窗的博客排版工整,界面很美觀
    • 問題總結作得很全面
    • 對於書上的疑惑總會想辦法解決它,這種探索的精神值得我去學習
  • 代碼中值得學習的或問題:
    • 對於編程的編寫總能找到角度去解決
  • 本週結對學習狀況
    • 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
相關文章
相關標籤/搜索