2012-07-10 103 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