如果没有所有重复,我将如何编写此代码
// 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 )
}
有两个部分......
f = ...
部分m
编辑:代码的作用......
mid
表示按字母顺序排序的固定长度单词列表中的任意入口点,没有分隔符。我的目标是列出所有匹配set前缀的单词,因此必须找到任意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,以便它匹配前缀而不是整个单词,并返回一组结果,而不是真值。我也在那里设置了一个限制,因为我将使用它来实现自动完成功能,它只需要几个返回值,而不是所有匹配。
答案 0 :(得分: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);
}
}
我已将所有变量都包含在参数列表中,因为它们的范围不明确。
答案 1 :(得分:2)
将它放入函数中并传入delta。由于m ++向m添加+1,而m--在-1中添加-1,因此可以调用例如:
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);
我只是将匹配作为返回值,因为我不确定您的代码尝试做什么,但它应该向您展示这个想法。
答案 2 :(得分: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)
我希望可以帮助你。