2012-07-10 107 views
0

我怎麼會寫這樣的代碼,而所有的重複刪除重複的代碼

// I have a loop which decrements m each time 
    // set m to the starting point 
    m = mid 
    // set f to a calculated array value 
    f = dict[l].substr(l * --m, l) 
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){ 
     matches.push(f); 
     // same as what was defined outside the while loop 
     // which seems to me like unnecessary repetition 
     f = dict[l].substr(l * --m, l) 
    } 
    // then I repeat it all, but incrementing m 
    // reset m to the starting point 
    m = mid 
    f = dict[l].substr(l * m++, l) 
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){ 
     matches.push(f); 
     f = dict[l].substr(l * m++, l) 
    } 

有兩個部分...

  1. 每個塊包含重複f = ...部分
  2. 塊被重複,只改變增量/減量m

編輯:代碼做什麼...

mid表示任意入口點的無隔板固定長度的單詞的字母順序排序列表。我打算列出與設置的前綴相匹配的所有單詞,因此必須找到任意點後面的所有單詞(如二進制搜索方法所輸入的)並轉發。


編輯:詳細資料...

字典是這樣的:

dict = [ 
    "", // offset other values to equal word length 
    "ai", // all length 1 
    "inatonuptogo", // all length 2 
    "catcrydogendgodhamhathit", // all length 3 
    "foodhackhallhandhardhatehatshavehellridewood" // all length 4 
] 

l是搜索詞字長,所以dict[l]是從字典中的字一行,長度爲l

我正在修改John Resig's binary search method,以便它匹配前綴而不是整個單詞,並返回一組結果,而不是一個真值。我也在這裏設置了一個限制,因爲我將這個用於自動完成功能,它只需要一些返回的值,而不是所有的匹配。

+2

如果您向我們提供代碼實際執行的執行摘要,將會有所幫助。 – 2012-07-10 22:46:07

回答

2

你可能會拉環插入函數,因爲除了增/減,它們是相同的:

function helperFunction(m, f, l, mid, dict, matches, limit, increment) 
{ 
    m = mid; 

    if (increment) 
     f = dict[l].substr(l * m++, l); 
    else f = dict[l].substr(l * --m, l); 

    while (f.substr(0, x) === word && (!limit || matches.length < limit)) 
    { 
     matches.push(f); 
     f = dict[l].substr(l * m, l); 

     if (increment) 
      f = dict[l].substr(l * m++, l); 
     else f = dict[l].substr(l * --m, l); 
    } 
} 

我已經包括在參數列表中的所有變量,因爲其範圍目前還不清楚。

2

把它放在一個函數中,並通過三角洲。由於M +是增加+1米,M--是增加-1到m,您可以撥打例如:

function foo(mid, dict, delta) { 
m = mid 
// f = dict[l].substr(l * m += delta, l) 
    f = dict[l].substr(l * m, l); 
    m += delta; 
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){ 
     matches.push(f); 
     // f = dict[l].substr(l * m += delta, l) 
     f = dict[l].substr(l * m, l); 
     m += delta; 
    } 
    return matches; 
} 

matches = foo(mid, dict, -1); 
matches = foo(mid, dict, +1); 

我只拉出比賽作爲返回值,因爲我不知道是什麼你的代碼試圖去做,但它應該向你展示這個想法。

+0

這看起來不錯...有什麼辦法可以防止'f = ...'行被重複? – 2012-07-10 22:59:17

+0

其實我發現了一個錯誤:(l * m + = delta)顯然是錯誤的,它是一個非法的左值。它必須是(l * m)並在下一個語句中更新m。我會在我的答案中更新代碼。 – moopet 2012-07-10 23:06:58

+0

由於f = ...內容重複,您可以將while循環重寫爲do {..} while(..)循環,它會在測試條件之前執行一次代碼。 – moopet 2012-07-10 23:11:20

0

@Billy Moon,你能驗證下面的代碼嗎?

function foo(flag, m) { return dict[l].substr(l * (Boolean(flag)) ? --m : m++), l); } 
var flag = 1; 
do { 
    m = mid 
    f = foo(flag, m) 
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){ 
     matches.push(f); 
     f = foo(flag, m) 
    } 
    flag--; 
} while(flag > -1) 

我希望可以幫助你。

+0

之後遞增當你遞歸超過20個深度IIRC時,請注意遞歸 - IE barfs。 – Julian 2012-07-11 21:09:48