我使用的是Lua - 只是一个FYI,因此在10 ^ 10位后,比较变为无效IIRC。
我有一个包含50,000个名字的列表 - 这个名单甚至可能增加到数十万个。我试图在搜索栏中输入显示部分名称的潜在匹配列表,因此如果我输入"和",则可能会弹出这些匹配:
"安迪" "安德鲁" "安德烈" 等一次最多20场比赛。
每个名称都是唯一的 - 没有完全相同的名称。名称可以包含字母,数字,空格和句点。运行代码时,这些名称的表/数组不会以任何方式排序。在Lua中,当用户在搜索栏中输入名称时,如果可能,我怎么能显示实时潜在匹配?
答案 0 :(得分:2)
下面的简单程序对我来说很合适。没有奇特的数据结构,只是普通的强力搜索。使用/
开始新查询。使用.
结束该计划。使用,
作为退格。
/usr/share/dict/web2a
中的字词列表包含76205个字词。它的/usr/share/dict//words
也很好,有235886个字。
local t={}
for w in io.lines"/usr/share/dict/web2a" do
t[w]=true
end
os.execute("stty cbreak </dev/tty >/dev/tty 2>&1")
local s=""
while true do
io.write("> ",s)
local c=io.read(1)
if c=="." then break end
if c=="/" then s="" elseif c=="," then s=s:sub(1,-2) else s=s..c end
local n=0
print()
for w in pairs(t) do
if w:sub(1,#s)==s then
n=n+1
print(n,w)
if n>=10 then break end
end
end
end
os.execute("stty -cbreak </dev/tty >/dev/tty 2>&1");
答案 1 :(得分:0)
由于每个名称都是唯一的,因此创建一个db并将所有名称存储在索引列中,并在每次键击后使用LIKE关键字运行查询。查询将快速运行,因为LIKE是一个字符串函数,并且您的索引也是基于字符串的。根据您的技术堆栈,它将看起来像这样:
Lua基于ANSI-C,并且由于ANSI-C不提供密钥绑定功能,因此默认的Lua库也是如此。但是,我相信现在可以使用Links-Lua库中的bind_key函数将Lua函数绑定到击键。