表驅(qū)動法的準則
使用表驅(qū)動法的關(guān)注的兩個核心問題:
- 1 怎樣從表中查詢條目的問題;
- 2 應(yīng)該在表里面存什么
兩個核心問題都談到了表,那么這個’表‘是什么東西呢?
用過hash(哈希)的同學知道, 其內(nèi)部是維護一個存放地址的表格,通過hash去快速得到,那么同樣我們用來存放東西就可以描述成一個表
直接訪問表
- 例子一: 將數(shù)組作為表
// 下面原先的方法,是一個長長的swtich語句
String today = "周日";
Switch( dayForMonth % 7 ){
case 0 :
today = "周日";
case 1 :
today = "周一";
case 2 :
today = "周二";
case 3 :
today = "周三";
case 4 :
today = "周四";
case 5 :
today = "周五";
default:
today = "周六";
}
按照書上所說 , 要為switch 的 每一個分支加一 復(fù)雜度, 上述的復(fù)雜度是 7
// 使用表驅(qū)動
// 使用一個數(shù)組去存入一周的日期
String [] weekday = new String[]{"周日","周一","周二","周三",
"周四","周五","周六"};
String today = weekday [ dayForMonth % 7 ];
瞬間清爽了很多梢为。
直接訪問表 方式二
- 例子二 : 用二維的數(shù)組去存放一個結(jié)果集
// 原來的代碼
if( (a && !c ) || (a && b && c)){
category = 1 ;
}else if( (b && ! a) || (a && c && !b)){
category = 2 ;
}else if ( c && !a && !b){
category = 3 ;
}else {
category = 0 ;
}
// 轉(zhuǎn)換為 ( 這里 是 三維 的結(jié)果轉(zhuǎn)成二維 去存放)
static int categoryTable[2][2]={
//!b!c !bc b!c bc
0, 3, 2, 2, // !a
1, 2, 1, 1, // a
}
// 使用
category = categoryTable[1][0];
索引訪問表
- 例子三: 將hashMap作為表,那么首先要構(gòu)建 hash的 key - value
// 存入 hashMap結(jié)構(gòu) key 是 weekday ,value 是 doSomething
String [] weekday = new String[]{"周日","周一","周二","周三",
"周四","周五","周六"};
String [] doSomething = new String[]{"出游","開會","上班","學習",
"運動","加班","休息","娛樂"}
// 構(gòu)建hash 的鍵值對
Map<String,Object> map = new HashMap();
for(int i = 0; i < weekday.length; i++){
map.put( weekday[i],doSomething[i] );
}
// 取出hash 的值
public static String doWhat (String today){
return map.get(today);
}
public static void main (String arge[]){
system.out.pringf(doWhat(weekday[ dayForMonth % 7 ]));
}
階梯訪問表
- 例子四: 用兩個數(shù)組
0-59 分是不及格 F級
60- 79 是及格 E級
80-84 是普通 D級
85-89 是良好 C級
90 - 94 是優(yōu)秀 B級
95-100 是太棒了 A級
最重要的是, 我的表里面是存放了 區(qū)間的上界 , 用來區(qū)分等級
int [] grade = {59,79,84,89,94,100};
String [] level = {"F","E","D","C","B","A"},
public String getLevel (int grade){
for( int i = 0 ; i < grade.length ; i++){
if(grade <= grade[i]){
return level[i];
}
}
}