lua array2d检查值是否存在

时间:2016-11-12 11:30:26

标签: arrays multidimensional-array lua lua-table

我真的需要帮助。我仍然无法弄清楚我的逻辑lua代码关于如果我已经有一个值,我怎么能用if条件阻止事件呢?

这是我的array2d:

mydata = {
{"mike", "30", "1"},
{"michael", "40", "2"},
{"mike", "40", "2"},
{"michael", "50", "3"},
{"frost", "50", "3"},
{"nick", "60", "4"}
}

实际上,我的计划是获取正确的代码来检查索引名称mydata[..][1]和点索引mydata[..][3]

这是一个示例案例解释:

所以如果如果索引名称Michael和点索引3不存在 如果仅名称{ {1}}存在它没有点索引michael,然后它会在 data.txt 中写入3。如果名称和点索引已存在,则。然后,它将阻止并打印("抱歉,您的姓名和得分指数已经存在")

我的代码:

michael:50:3

阻止活动的最佳方式是什么?#34;写mydata = {{"mike", "30", "1"}, {"michael", "40", "2"}, {"mike", "40", "2"}, {"michael", "50", "3"}, {"frost", "50", "3"}, {"nick", "60", "4"}} function check_point1(tab, val1) -- Function for checking name for index, value in ipairs (tab) do if value[1] == val1 then return true end end return false end function check_point2(tab, val1) -- Function for checking player point after name for index, value in ipairs (tab) do if value[3] == val1 then return true end end return false end -- this is example case -- these below are variable to process checking if it's exist name = "michael" id = "3" -- this is my checking code, idk it's good or not. or maybe it's wrong code. because it's not working if check_point1(mydata, name) then if check_point2(mydata, id) then print(your name and point index are exist. sorry you can't earn this point") else print(only your name exist. let us save your new point now") end else print("your name and point index is not exist. let us save your name and point now") local file = io.open("data.txt", "r") file:write("michael:50:3") file:close() end "什么时候它已经存在?在你帮助我之前,请告诉我你是否需要了解一些事情。我在lua仍然很穷。

1 个答案:

答案 0 :(得分:1)

我们可以将其分解为广义比较函数,该函数在一组记录中搜索与提供的记录(部分或全部)匹配的存储记录。

我们必须定义的第一个函数是辅助函数contains_all,它接受​​target记录和query记录,并测试是否target至少包含query所做的所有事情。

local function contains_all (target, query)
    for key, value in pairs(query) do
        if target[key] ~= value then
            return false
        end
    end

    return true
end

然后,我们可以轻松实现搜索功能,搜索记录的 set ,并根据相同的query记录检查每条记录。我们将此函数称为find_by,因为如果它找到匹配的记录,我们将返回该记录,并找到它所在的索引。

local function find_by (set, query)
    for i = 1, #set do
        if contains_all(set[i], query) then
            return set[i], i
        end
    end
end

现在我们可以简单地使用这些来查明mydata是否包含与我们选择的query记录匹配或部分匹配的记录。

local mydata = {
    {"mike", "30", "1" },
    { "michael", "40", "2" },
    { "mike", "40", "2" },
    { "michael", "50", "3" },
    { "frost", "50", "3" },
    { "nick", "60", "4" }
}

print(find_by(mydata, { [1] = "michael", [3] = "3" })) --> table: 0x217d890 4

由于我们存储的记录是序列,我们使用显式括号表示法来设置索引,在这种情况下跳过第二个索引。

由于此函数在匹配时返回一个表,并且在不匹配的情况下返回nil,因此我们现在有一个安全的布尔约束; table是一个真值,而nil是一个虚假的。

if find_by(mydata, { [1] = "michael", [3] = "3" }) then
    print('Entry exists')
end

返回记录使我们更容易进行进一步检查,而无需再次查询每条记录。

local found = find_by(mydata, { "michael" })

if found then
    if found[3] == "3" then
        print('Entry exists.')
    else
        print('Only name exists.')
    end
else
    print('Entry does not exist')
end