1. 程式人生 > >20172308《Java軟件結構與數據結構》第四周學習總結

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

特點 第一周 裏的 .html 過程 而是 添加 生成 bubuko

教材學習內容總結

第 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

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