2007年9月12日 星期三

Collections API 簡介

Collections 提供了很多好用的method讓您操作資料結構
以下用一個簡單的範例來介紹:

double array[] = {123, 112, 57, 355, 255};
double subArr[] = {57};

List<Double> list = new ArrayList();
List subList = new ArrayList();

for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}

for (int j = 0; j < subArr.length; j++) {
li.add(new Double(subArr[j]));
}

//排序, 印出 57,112,123,255,355
Collections.sort(list);

//反向排序
Collections.sort(list, Collections.reverseOrder());

//亂數排序
Collections.shuffle(list);

//倒轉元素, 印出 255,355,57,112,123
Collections.reverse(list);

//移動元素, 正數元素會往右移動, 負數則往左移動
Collections.rotate(list, 1);

//元素出現的頻率, 該例回傳 1
Collections.frequency(list, new Double(112));

//搜尋該元素的位置, 但使用該 method 必須是先排序過的
//例如使用Collections.sort(), 不然會回傳負值, 本例印出 1
Collections.binarySearch(list, new Double(112));

//將新元素取代原來的物件內容, 該例會全部印出 100
Collections.fill(list, new Double(100));

//比較子元素最後的位置, 本例印出 2(若找不到回傳-1)
Collections.lastIndexOfSubList(list,subList)

//比較子元素的位置
Collections.indexOfSubList(list,subList)

JOIN 的簡易操作

要連接兩張資料表, JOIN 是不可或缺的指令, 以下用兩張很簡單的表格,
來簡介如何操作 JOIN.

Table1: test1

Table1: test2

id

name

id

name

1

Allen

1

Allen

2

Bill

2

Bill

5

Jack

4

Jack


若我們的SQL指令如下:

select *
from test1 as t1 INNER JOIN test2 as t2
on t1.id = t2.id

則表示兩張表格的權重相等, 必須兩張表格都有相同 id 的資料, 才會取出
(在本例中, 兩張表格都有 id 1,2 這幾筆資料已達到 inner join 的條件)

再看下一條指令:

select *
from test1 as t1 LEFT JOIN test2 as t2
on t1.id = t2.id

使用 left join 表示合併的權重以左邊的表格為主, 條件會以左邊表格的 id 去比對
在本例中, 會列出 id 值為 5 的record.

至於 RIGHT JOIN 的原理跟 LEFT JOIN 是完全相同的,
只是差在它是以右邊表格的權重為主.

2007年9月10日 星期一

指定編譯器版本(eclipse, IDEA)

在進行不同的專案時,有時會遇到專案的編譯版本是不同的,
若沒有加以指定、則會遇到版本錯誤的訊息;以下簡易的分享eclipse、IDEA的指定方式。

eclipse: project-->properties-->java complier-->complier compliance level

idea: project-->module settings-->source-->language level

只要設定完成、加以重新編譯,專案就很容易可以切換到不同版本的JDK了。

2007年9月5日 星期三

Composing Methods

1. Extract Method
動機: 函示過於冗長, 或一眼無法得知該函示的用意
方法: 將程式碼組織, 並獨立出來, 注意在 refactoring 的過程, 需取有意義的函示與變數名稱

2. Inline Method
動機: 若該函示屬於不必要的, 或多餘的
方法: 將函示的程式碼整合進來, 並移除該函示

3. Inline Temp
動機: 暫時變數只被賦值一次
方法: 去除暫時變數, 直接使用運算結果, 可以在變數前加上 final 檢驗之

4. Replace Temp with Query
動機: 暫時變數只被賦值一次, 但可能被多次運用
方法: 去除暫時變數, 將運算的內容提煉到一個 private method

5. Introduce Explaining Variable
動機: 運算式複雜又難以閱讀時
方法: 將運算的內容提煉成變數, 來解釋該內容

6. Slipt Temporary Variable
動機: 程式有些變數不只被被賦值一次
方法: 針對每次賦值, 提供一個獨立、暫時的變數

7. Remove Assignments Parameters
動機: 有參數被直接賦值, 會降低程式的清晰度
方法: 以一個暫時變數, 代替參數的位置

8. Replace Method with Method Object
動機: 有一個大型函示, 無法直接對區域變數採行 Extract Method, 或有很多的區域變數是可以重複利用的方法: 將函示放進一獨立物件, 並將這些區域變數變成物件的 field

9. Substitute Algorithm
動機: 想把某個演算法替換為更清晰的演算法
方法: 將函示本體的演算法做替換