第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,有下面的原则:
在设计中,用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一个副本,成为两个对象)。
相关链接: 我的与编程思想相关的文章