在Lua中,可搜索的标记表?

所需做的是基于一些标签搜索表格。它需要根据标签数量创建匹配列表。如果我们有4个标签相匹配,那么这将是一个列表,3个标签另一个列表,2个标签另一个列表。你会如何使用lua表格来实现这个?

我不想要太复杂的东西,如果有一个不复杂设置的库或接口与数据库,则fine。但如果没有,我可以接受原生的解决方案,但速度和内存的代价很高。

我说的标签是这样的

假设我们有表格

T [1] = {cat,mouse bat,fly,car,airplane,glider}

像蝙蝠,飞行器,飞行器和滑翔机这样的词语将具有可飞行的标签。另一个标签可能是汽车和飞机的机器。另一个标签是动物:猫,老鼠,蝙蝠,苍蝇。因此,如果您使用可飞行的+机器两个标签进行搜索,则会得到飞机。如果您搜索动物+可飞行,则会得到蝙蝠和苍蝇。因此,我需要一个包含此标签信息的结构,可让我轻松搜索。

点赞
用户173806
用户173806

Sets 可能是你正在寻找的数据结构类型。请查看 Programming in Lua 书中所解释的 Set。

2014-03-12 23:43:35
用户1775869
用户1775869
function findtable(table,value)
        for k,v in pairs(table) do
                if (v == value) or (k == value) then
                        return true
                end
        end
        return false
end

function tagged_flyable(value)
    local flyable_table = {'bat','fly','airplane','glider'}
    if(findtable(flyable_table,value) == true) then
        return true
    else
        return false
    end
end

function tagged_animals(value)
    local animals_table = {'cat','mouse','bat','fly'}
    if(findtable(animals_table,value) == true) then
        return true
    else
        return false
    end
end

function tagged_machines(value)
    local machines_table = {'car', 'airplane'}
    if(findtable(machines_table,value) == true) then
        return true
    else
        return false
    end
end

-- 主要流程
local T_1 = {'cat','mouse', 'bat', 'fly', 'car', 'airplane', 'glider'}
local search_results = {}
-- 搜索 flyable+machine 标签
for i=1,table.getn(T_1) do
    if(tagged_machines(T_1[i]) and tagged_flyable(T_1[i])) then
        table.insert(search_results, T_1[i])
        print("found :", T_1[i])
    end
end

-- 搜索 flyable+animals 标签
search_results = {}
for i=1,table.getn(T_1) do
    if(tagged_animals(T_1[i]) and tagged_flyable(T_1[i])) then
        table.insert(search_results, T_1[i])
        print("found :", T_1[i])
    end
end
2014-03-13 02:50:30
用户869951
用户869951

最简单的方法是创建一个标签表,和两个结果表。标签表如下:

T = {cat={"animal", "legs"}, bat={"animal", "wings"}, ...}

结果表只是普通表格,表示哪些对象具有特定的标签:

res1 = get(T, "wings")
print(res1) -- 输出 cat bat plane
res2 = get(T, "machine")
print(res2) -- 输出 car train plane

然后就有一个函数来查找两个结果的交集:

bothTags = getIntersection(res1, res2)

getIntersection()函数只需要循环第一个表res1,并测试如果res2[第一个表中的物品]是nil,如果不是,则两个表都有一个项。

2014-03-13 19:10:17