如何快速查找匹配的字符串?

我正在使用Lua - 只是一件FYI,因此在10 ^ 10位数字之后,比较变得无效。

我有一个包含50,000个名称的列表 - 这个列表甚至可能增加到数十万。我正在尝试显示部分名称的潜在匹配项列表,因此如果我输入“And”,这些可能会弹出:

"Andy" "Andrew" "安德烈" 等等,最多一次20个匹配项。

每个名称都是唯一的 - 没有完全相同的名称。名称可以包含字母,数字,空格和句点。当运行代码时,这些名称的表/数组没有按任何方式排序。在Lua中,如果可能的话,如何在用户在搜索栏中键入名称时实时显示潜在匹配项?

点赞
用户1512743
用户1512743

由于每个名字都是唯一的,请创建一个数据库并将所有名称存储在索引列中,并在每个按键之后使用LIKE关键字运行查询。查询将运行得很快,因为LIKE是一个字符串函数,您的索引也是基于字符串的。根据您的技术堆栈,它可能看起来像这样:

Lua是基于ANSI-C的,由于ANSI-C不提供关键绑定能力,因此默认的Lua库也没有。但是,我相信现在可以使用Links-Lua库中的bind_key函数将Lua函数绑定到按键。

2014-07-30 07:07:35
用户107090
用户107090

下面的简单程序对我来说很有效。没有花哨的数据结构,只有简单的暴力搜索。用 / 开始新查询,用.结束程序。用 , 作为退格键。

/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");
2014-07-30 12:42:51