在lua中可搜索的标记表格?

时间:2014-03-12 09:05:50

标签: search data-structures lua lua-table

所以我需要根据许多标签搜索表格。

需要根据标签数量创建匹配列表。 因此,如果我们匹配4个标签作为列表,则3个标记另一个列表,另外2个标记。

你将如何用lua表实现这个?

我不想要太复杂的东西,如果有一个库或一个数据库的设置并不复杂,那就好了。

但如果不是,我可以以速度和记忆为代价接受本机解决方案。

我的意思是标签是

让我们说我们有桌子

T [1] = {猫,鼠标蝙蝠,苍蝇,汽车,飞机,滑翔机}

其中一些术语,如蝙蝠,飞行,飞机,滑翔机,都会有一个标签可以飞行。

另一个标签可能是汽车和飞机的机器。

另一个标签是动物:猫,老鼠,蝙蝠,苍蝇

因此,如果您使用两个标签flyable + machine搜索,您将获得airpalne 如果你搜索动物+飞行你会得到蝙蝠和飞行。

所以我需要的是一个包含这个标签信息的结构,让我可以轻松搜索。

3 个答案:

答案 0 :(得分:1)

集可能是您要查找的数据结构的类型。请按照Programming in Lua一书中的说明查看“设置”。

答案 1 :(得分:1)

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

-- main process
local T_1 = {'cat','mouse', 'bat', 'fly', 'car', 'airplane', 'glider'}
local search_results = {}
-- search for tag: 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


-- search for tag: 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

答案 2 :(得分:1)

最简单的是一个标签表,加上两个结果表。标签表:

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

结果表只是常规表,其中的对象具有某个标记:

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

然后找到两个结果的交集的函数:

bothTags = getIntersection(res1,res2)

getIntersection()只需循环遍历第一个表res1并测试res2 [itemFromFirstTable]是否为nil,如果没有则则表示两个表中都有一个项目。