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

时间:2014-07-30 06:14:52

标签: arrays sorting lua

我使用的是Lua - 只是一个FYI,因此在10 ^ 10位后,比较变为无效IIRC。

我有一个包含50,000个名字的列表 - 这个名单甚至可能增加到数十万个。我试图在搜索栏中输入显示部分名称的潜在匹配列表,因此如果我输入"和",则可能会弹出这些匹配:

"安迪" "安德鲁" "安德烈" 等一次最多20场比赛。

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

2 个答案:

答案 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函数绑定到击键。