【问题标题】:lua array2d check value if existlua array2d 检查值是否存在
【发布时间】:2017-03-26 12:51:13
【问题描述】:

我真的需要帮助。我仍然无法弄清楚我的逻辑 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不存在 如果只有名称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) -- 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

当事件“写michael:50:3”已经存在时,阻止它的最佳方法是什么?在你帮助我之前,让我知道你是否需要了解一些事情。我在 lua 方面仍然很差。

【问题讨论】:

  • Han,你现在已经问了几个类似的问题,它们似乎都围绕着基本的程序流程、简单的算法和标准的 Lua 库。提问很好——它可以帮助你学习——但你也可能会发现通过采用更通用的学习方法可以学得很好。请务必阅读Programming in Lua,将Reference Manual 放在手边,并考虑参加当地的大学课程,或者在线学习编程课程,因为一些通用编程课程会有很长的路要走。
  • 是的,我知道,我问了很多次。我应该尝试自己学习更多,但是 idk。我已经尝试了很多次并尝试思考 lua 是如何工作的,但是 lua 真的很难。所以我问更多问题不是因为我想完成我尝试的一些脚本。但这可以成为我的教训。实际上,当我第一次提出问题时,有人回答了它的工作原理并解释了我的代码无法正常工作的原因。它对我的学习帮助很大。我不仅在学习 lua,而且还在学习大多数编程语言,如 c#、java 等,我也想学习 lua,但我只需要帮助。因为它不同
  • 比其他语言。

标签: arrays multidimensional-array lua lua-table


【解决方案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

然后我们可以轻松实现我们的搜索功能,该功能搜索记录集,并根据相同的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,我们现在有了一个安全的布尔对比;表格是真值,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

【讨论】:

  • 感谢您的解释,好的。你真的帮了我。它工作正常。我很乐意了解更多关于这些功能的信息,我还没有发现方法。
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2010-11-23
  • 2011-06-26
  • 2018-09-05
  • 2013-03-03
  • 2021-02-19
相关资源
最近更新 更多