1. 程式人生 > >20172310 2017-2018《程序設計與數據結構》(下)第四周學習總結

20172310 2017-2018《程序設計與數據結構》(下)第四周學習總結

自己 yun class 插入 adt 調試 數組 清晰 增加

學號 2017-2018-2 《程序設計與數據結構》第四周學習總結

教材學習內容總結

第六章主要研究了列表的概念以及某些管理列表的方法。

列表集合

  • 鏈表與列表集合之間的差別:鏈表是一種實現策略,使用引用來在對象之間創建鏈接。
    之前的學習中就使用了鏈表來分別實現棧和隊列集合。 列表集合是種概念性表示法,
    其思想是使事物以線性列表的方式進行組織。
    就像棧和隊列一樣,列表也可以使用鏈表或數組來實現。
  • 列表集合沒有內在的容量大小,它可以隨著需要而增大。
  • 棧和隊列都是線性結構,可以像列表那樣進行思考,但其元素只能在末端添加和刪除。列表集合更一般化,可以在列表的中間和末端添加和刪除元素。
  • 列表集合的3種類型:
    • 有序列表(Cordered list), 其元素按照元素的某種內在特性進行排序。
    • 無序列表(unordered list),其元素間不具有內在順序,元素按使用者所選擇的任意方式排序。
    • 索引列表(indexed list), 其元素可以用數字索引來引用,維護一段連續的數字索引值。
  • 有序列表:列表基於某個關鍵值排序。對於任何已添加到有序表中的元素,只要給定了元素的關鍵值,同時列表已經
    定義了元素的所有關鍵值,那麽它在列表中就會有一個固定的位置。
  • 無序列表:各元素的位置並不基於元素的任何內在特性。但列表中的元素仍是按照特殊順序放置著,只不過這種順序與元素
    本身無關。列表的使用者會決定元素的順序。圖6.2是一個無序列表的概念圖。一個 新元素可以置於列表的前端或者末端,或者
    被插入到列表中某個特定元素之後。
  • 索引列表:各元素間也不存在能夠決定它們在列表中的順序的內在系。列表的使用者決定了元素的順序。不過,除此以外,其
    每個元素都能夠從一 個數字引值得到引用,該索引值從列表頭開始從0連續增加直到列表末端。新的元素可以被添加到列表的任
    一位置, 包括列表的前端和末端。每自列表發生改變,索引值就相應調整以保持順序和連續性。註意,索引列表和數組的根本區別在於:索引列表的索引值總是連續的。如果刪除了或插入,其他的元素會進行位移,以消除間隙或騰出位置。

Java 集合API中的列表

  • Java集合API提供的列表類主要是支持索引列表。在一定程度上,這些類與無序列表是重疊的。
    然而,需要註意的是,Java API並沒有任何類能直接實現以上描述的有序列表。

    ArrayList和LinkedList都實現了java.util.List 接口。
    技術分享圖片

由Java API提供的列表的示例。

  • 使用無序列表:學習計劃
  • 索引列表:Josephus問題(當列表中的事件不是按照順序取出而是每隔i個元素提取,直到結束,如何找到這些事件的順序)

列表ADT

  • 很多常見操作可以為所有類型的列表定義。這些操作之間的差別在於如何添加元素。
  • 有一些操作對有序列表和無序列表都是通用的。有序列表與無序列表之間的差別通常主要體現在往列表添加元素上。
  • 在有序列表中,只需指定要添加的新元素。該元素在列表中的位置取決於其鍵值。
  • 無序列表支持add操作的3個變體。可以把元素添加到列表的前端、末端或是列表中某個已有元素的後面。
    技術分享圖片

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

  • 問題1:設計要點

某個列表是否可以既是有序列表,又是索引列表?可能,但沒有什麽意義。如果某個列表既是有序列表,又是索引列表,那麽,如果客戶應用程序試圖在某個索引處添加一一個元素,或者修改了某個索引處的元素(這樣該元素就不在正確的順序位置了),情況會怎麽樣?哪個規則的優先級更高,索引位置還是順序?

  • 問題1解決方案:XXXXXX
  • 問題2:最後,save和load方法分別用來把ProgramOfStudy對象寫入個文件中, 以及從文件中讀取它,(與在前面示例中看到的基於文本的IO操作不同,這裏使用一個名 為串行化的過程,以二進制流的形式來讀取和寫入對象。因此,只需兒行代碼,就可以把對象的當前狀態存儲起來。在這裏意味著,當前存儲在學習計劃中的所有課程,都作為對象的一部分而存儲。

註意,ProgramOsudy和Course類實現了Serializable 接口。為了是某個對象能使用串行化進行在儲,其類必須實現Serializable.在Serializable接口中沒有任何方法,它只是表明,該對象可以轉控為串行化表示形式。ArrayList 和LmkedList類也實現了Serializable接口。

串行化

public class Course implements Serializable

表明該類可以被串行化對

Serializable接口不含有任何方法

  • 問題2解決方案:XXXXXX
  • ...

代碼調試中的問題和解決過程

  • 問題1:技術分享圖片

  • 問題1解決方案:XXXXXX
  • 問題2:XXXXXX
  • 問題2解決方案:XXXXXX
  • ...

代碼托管

(statistics.sh腳本的運行結果截圖)

上周考試錯題總結

  • 錯題1及原因,理解情況
  • 技術分享圖片
  • 解析:題目的意思是公共特征應盡可能地位於類層次結構中的低層,盡量減少維護工作量。但是公共特征應該是放在父類,甚至更先的類中,而這些是類層次結構中的高層,主要是沒有理解好類層次結構,才導致了這個題目的錯誤。

  • 錯題2及原因,理解情況
  • ...

結對及互評

點評:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 本周結對學習情況
    • 結對同學學號1

    • 結對學習內容
      • 對實驗一遇見的問題進行討論
      • 教材第六章內容的共同學習
      • 第六章代碼編寫的討論

點評過的同學博客和代碼

  • 上周博客互評情況
    • 學號 2018-2019-20172309 《程序設計與數據結構(下)》第三周學習總結

    • 碼雲鏈接20172309的碼雲鏈接

      其他(感悟、思考等,可選)

我們的學習模式又回到了上個學期,又不斷的提前在學習內容,其實課前預習是好的,但是我覺得博客的提交時間
可以放到這一章的課上完之後再提交,畢竟如果在上課之前我們就把所有的問題都寫好了,時間有點緊,而且如果
是上完課,對自己教材問題的解答也會更加的清晰,所以我覺的可以在上一個博客完成之後放出下周學習的要求,
但是deadline可以定在上完課之後的一兩天,這樣就不會那麽緊張,也能達到預習的效果。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一周 0/0 1/1 10/10
第二周 326/326 1/2 18/28 學習在一點點的深入
第三周 784/1110 1/3 25/53

參考資料

  • 《Java程序設計與數據結構教程(第二版)》

  • 《Java程序設計與數據結構教程(第二版)》學習指導
  • ...

20172310 2017-2018《程序設計與數據結構》(下)第四周學習總結