第22課 Component和Comtainer 2011.8.9-10
這是一張圖,可以從中看出componenet和Container的關係,而JComponent,例如Swing,是Container的一個子類。
A component is anything that can appear in a window, A containers contains other components。從圖上可以看到,Container是繼承了Component,也就是Container也是一個Component。
介紹了component大小隨著視窗resize而自動適配的方式。根據自上而下的編程方式,在Program中放置一個可自適應尺寸的MyCavas,pulic class MyCavas extends GCanvas implements ComponmentLister{}。其中ComponmentLister中重寫resize的情況,其實也就是removeAll()之後,重新畫,而畫是基於size的,以此來實現。課程舉了兩個例子也說明此過程。
第23課 尋找、排序和演算法效率分析 2011.8.19
Searching和Sorting是在C語言學齡前學習中進行頭腦體操用,在Java中,我經常使用HashMap來處理,所以降到尋找和排序,好似回複很久以前的年代,至少JAVA中不需要考慮鏈表。尋找和排序來講,效率很重要,但是簡潔易懂的程式同樣很重要。
介紹線性掃描,對於隨機無序的資料,貌似沒有什麼其他好方法。對於已排序好的,C中我一般用二分法,效率高嘛。接著就介紹了這種binary search的方法。二分法如下,對於整數,low+high可能會超過邊界(int 32bits)的問題,如果你需處理的資料真的很多很多。
while(lh <= rh){
int mid =(lh+rh)/2;
if(key == disp.get(mid)) return mid;
if(key <= disp.get(mid)){
rh = mid-1;
}else{
lh = mid+1;
}
}
return -1;
排序首先介紹冒泡法,古老的回憶,值得寫下來。但是冒泡的效率為N(N-1)/2,可以對之進行改造,設計N個隊列,每個隊列有一定大小範圍,將資料放入這些隊列,使之成為長度較短的隊列,大幅度降低N,然後對之進行排序,最後在組成一個有序的隊列。
for(int lh = 0; lh < array.length; lh ++){
int rh = findSmallest(array,lh,array.legnth);
swapElements(array,lh,rh);
}
第24課 管理大型資料中的良好軟體工程原理 2011.8.23
從這一課開始,沒有中文翻譯了。本課介紹與組織資料相關的設計思路。資料管理包括線上商店,社交網路,web search,有下面的原則:
- 名詞nouns –>Classes,例如Song,Album
- 動詞verbs –>methods
- 唯一ID標識 unique identifier,用於尋找,或需要通過key來組織的結構。
在設計中,用Collection來管理對象集合。Collection提供add, remove, clear, contains, size, isEmpty,iterator的方法。
舉一個音樂線上商店的例子,有很多音樂Song,以及專輯Album(包含若干Songs),名詞是Song和Album。對應兩個Class:Song和Album。對於這個商店例如叫FlyTurn,動作例如addSong和AddAlbum。
類Song,我們考慮哪些是nouns,哪些是verbs,nouns包含name,band,price,增加unique Identifier,因為名字和band都是可能會重複,本例ID採用name+band共同決定。這裡price是可以變更的,因此動作有getName(), getBand(), getPrice()和setPrice(),此外還有toString(),是否會發生變化,將確實是否會有set的方法。假設採用Map的方式,即需要key,不適合使用name和band兩個標識,可以將toString()作為唯一標識(其實就是由name和band共同確定)。
類Album。Alumb的相關名詞有:title,band,list of Songs(ArrayList,不採用Array因為長度不確定)。對於動作,addSong()已放置Song進入list,如果需擷取songs,設計通過Iterator<Song> getSongs()。唯一ID採用title來確定。類經常會提供toString()方法用於顯示資訊。
資料群組織:例子採用ArrayList<Song> songs來保管songs,採用HaspMap<String,Album> albums來保管album。可以通過圖例來清晰表達這些資料之間的關係。
注意到這些song指向同一個對象,成為Shallow copy,是通常的方式,保證資料一致性。只有某些特殊的情況,才會採用deep copy(完全copy一個副本,成為兩個對象)。
相關連結:我的與編程思想相關的文章