集合的同構與異構:如上所述,同構的集合只能保存類型相同的對象;異構的如ArrayList就能夠保存不一樣的對象,主要基於繼承機制和多態性。
書中一句話我認爲出現了翻譯不到位的地方:php
ArrayList儲存的是對象的引用html
不通順,應該是ArrayList儲存的是Object(類)的引用。node
數據結構的動態表示:這裏能夠看到ArrayList類和咱們這章要作的並不同,這也是爲何我以前強調「做用差很少」,其結構從結構角度上來講只是半個動態的,不過高效。git
動態鏈接的列表:emmm,就是咱們在藍墨雲上作的那個吧。web
其餘的動態列表:除了咱們作的單向鏈表,還有雙向鏈表,其最後節點的next
和最前節點的prev
(頭節點)都是null
,向前向後訪問時較方便,但創建、修改鏈表較爲複雜。緩存
至於線性數據結構,其中最重要的應該是棧,如今纔看到這裏真是「相見恨晚」,當時四則運算項目開始進行前就看到了就會輕鬆一點點了。數據結構
非線性,略學習
因爲上課老師講課時睡着了(認錯),一覺醒來就要求作做業,但對於鏈表的知識是億臉懵逼,node
next
list
到底是什麼呢? 參考了一下文章數據結構(一) 單鏈表的實現-JAVA翻譯
head爲頭節點,他不存聽任何的數據,只是充當一個指向鏈表中真正存放數據的第一個節點的做用,而每一個節點中都有一個next引用,指向下一個節點,就這樣一節一節往下面記錄,直到最後一個節點,其中的next指向null。設計
單看書中的圖片比較抽象,文字結合圖片來看一目瞭然。
再對照書中的和文章中的代碼
public void addNode(Node node){ //鏈表中有結點,遍歷到最後一個結點 Node temp = head; //一個移動的指針(把頭結點看作一個指向結點的指針) while(temp.next != null){ //遍歷單鏈表,直到遍歷到最後一個則跳出循環。 temp = temp.next; //日後移一個結點,指向下一個結點。 } temp.next = node;
public void add(Magazine mag) { MagazineNode node = new MagazineNode(mag); MagazineNode current; if (list == null) { list = node; } else { current = list; while (current.next != null) {current = current.next;} current.next = node; } }
head == list。這再看不懂就沒道理了。temp.next
就是指temp
的下一個節點,指針的運用很重要。
這樣的問題並非什麼大問題,可是若是有地方要用到「一個對象出現兩次」,結果被消除了(是在玩消消樂嗎?)那該如何是好?
public void Sort() { DVD temp; //緩存 if (list.dvd.compareTo(list.next.dvd) > 0) { temp = list.next.dvd;//若是前一個比後一個大 list.next.dvd = list.dvd;//緩存=後一個,後一個=前一個, list.dvd = temp;//前一個=緩存 } DVDNode temp1 = list; DVDNode temp2; while (temp1.next != null) { temp2 = temp1.next; while (temp2.next != null) { if (temp1.next.dvd.compareTo(temp2.next.dvd) > 0) { temp = temp2.next.dvd; temp2.next.dvd = temp1.next.dvd; temp1.next.dvd = temp; } temp2 = temp2.next; } temp1 = temp1.next; } }
爲什麼會消失,排序時使用選擇排序法,確定有變量遇到本身的一瞬間,就像若是我走在街上遇到一個和本身長的一摸同樣的人,我會拿本身和他(它?)比較,即compareTo()
,再深刻一點,個人compareTo
方法是:
public int compareTo(DVD mag) { int i = 0; int a = 0; while (title.charAt(i) == mag.toString().charAt(i)) { i++; } if ((int) (title.charAt(i)) < (int) (mag.toString().charAt(i))) {a = -1;} else {a = 1;} return a; }
只比較了title
,比較懶,不過也使檢查簡單了許多,並且變量的title
就一個字母,這裏沒有問題,比較過程也就是compareTo
的結果就是(int) 0
。
回到Sort()
,哪裏出了問題,啊啊啊啊啊啊,我用什麼讓另外一個本身消失呢?在同一時空不可能出現兩個本身,一我的不能夠和本身相遇,這就是有名的時間悖論,
靈光一閃!想到了刪除(delete()
)的原理:magazine類的刪除方法
public void delete(Magazine mag) { MagazineNode node = list; while (node.next.magazine != mag) { node = node.next; } node.next = node.next.next; }
刪除一個對象就是讓temp = temp.next.next
,也就是讓中間須要被刪除的節點空出來。當節點排序到本身前時,temp == temp.next
,兩段同時加上.next
,temp.next == temp.next.next
???與事實不符出現悖論!!!震驚!!!我用Java的單鏈表證實了單向流動的時間中所出現的時間悖論!!!因此問題解決了。爲了不這種無解的問題出現,遇到這種狀況,因爲二者是同一對象,當本身是本身的next時,就會自動合併了,這至關於出現時間悖論時,時間線自動收束,兩個本身合爲一個本身,其中一個併入了另外一個的時間線,不再會出現。
強行扯物理的關係,感受本身的物理和JAVA都白學了
(statistics.sh腳本的運行結果截圖)
錯題1: A recursive method without a base case leads to infinite recursion.
正確答案:A .true
緣由:書上有原話,可是看書本不仔細,沒記住:
請記住,列表的定義包括非遞歸定義和遞歸定義兩部分。非遞歸部分稱爲基本狀況。若是隻有遞歸部分定義的那一部分,則遞歸將永無終止。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 195/195 | 1/4 | 20/20 | 對代碼產生了很大興趣 |
第二週 | 309/504 | 1/5 | 20/40 | 打字速度明顯提高 |
第三週 | 311/815 | 2/7 | 25/65 | 無 |
第四周 | 474/1289 | 1/8 | 30/95 | 抗...抗壓能力增強? |
第五週 | 260/1549 | 1/9 | 15/110 | 瞭解到預習的重要性 |
第六週 | 358/1907 | 2/11 | 20/130 | 打字速度明顯提高 |
第七週 | 780/2687 | 2/13 | 15/145 | 學會使用JUnit |
第八週 | 2124/4811 | 2/10 | 15/160 | 無 |
第九周 | 967/5778 | 2/12 | 20/180 | 遞歸思想的利用 |
第十週 | 1047/6855 | 2/14 | 25/205 | 初步接觸數據結構 |
唐才銘19:博客中圖片不少,有助於閱讀理解,也有可能太多了(多是尺寸較大的緣故);MarkDown格式出現部分失誤,可簡單修改。
王文彬29:第一次使用表情包,這很好;上次遇到過的問題解決得不夠完全,此次的代碼問題1不該該再次出現。