lua 二维数组检查值是否存在

我真的很需要帮助。 我仍然无法理解我的逻辑lua代码关于如何使用if条件来阻止事件,当它已经有一个值时?

这是我的二维数组:

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 不存在 或者 如果只有名称 michael 存在 但是 它没有点指标3,然后它将在 data.txt中写入michael:50:3。但是如果名称和点指数已经存在。那么,它将阻塞并输出(“抱歉,您的名称和分数指数已经存在”)

我的代码:

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

function check_point1(tab, val1) -- 用于检查名称的函数
    for index, value in ipairs (tab) do
        if value[1] == val1 then
            return true
        end
    end
    return false
end

function check_point2(tab, val1) -- 用于检查名称后的玩家点数的函数
        for index, value in ipairs (tab) do
            if value[3] == val1 then
                return true
            end
        end
        return false
    end

--这是示例情况
--以下是处理检查是否存在的变量
name = "michael" 
id = "3"

--这是我的检查代码,我不知道它好不好。或者它是错误的代码。因为它不起作用
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:写(“michael:503”)
  file:关闭()
end

阻止事件“write michael:50:3”的最佳方法是什么? 让我知道如果你在帮助我之前需要理解某些事情。我仍然不擅长Lua。

点赞
用户2505965
用户2505965

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

第一个函数我们需要定义一个辅助函数 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

然后我们可以轻松实现我们的搜索函数,该函数在记录的 集合 中搜索,并针对相同的查询记录检查每个记录。我们称此函数为 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,因此我们现在有了一个安全的布尔对比; 表是一个真值,而 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
2016-11-12 13:34:41