lua数组包含特定值以供进一步检查

抱歉如果我现在打扰了你,我还在学习。但是我需要帮助。你能修正我并制作一个脚本来检查并获取数组2D的值以供进一步检查和计分吗?

我构建的示例数组2D语法如下:

role = {{[name],[points],[indexpoint]},{[...],[...],[...]}}

我制作的数组2D示例值如下:

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

我想要的是。当我搜索名称为“michael”时,它会在数组中检测到值。类似这样的东西

local player_data = {{"michael", 40, "2"},{"michael", 50, "3"}}

因此,在此之后,我可以计算他已经拥有的积分。40+50 并且结果“90”将发送到新变量,例如 resultpoint = 90

因此,打印将显示如下内容

Player "Michael"
Your points is "90"
Here is the list of your index that you earned :
1. earn 40 points in index point "2"
2. earn 50 points in index point "3"

我在此处写了很长的代码:

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

function check_role1(tab, val)
        for index, value in ipairs (tab) do
            -- 我们抓取我们的子表格的第一个索引(而不是玩家名称)
            if value[1] == val then
                return true
            end
        end
        return false
    end

    function check_role2(tab, val)
        for index, value in ipairs (tab) do
            -- 我们抓取我们的子表格的第三个索引(而不是索引点)
            if value[3] == val then
                return true
            end
        end
        return false
    end

    function detectroles(name)
        pn = name
        if check_role1 (role, pn) then
            print ('Yep')
            --[[for i = 1, #role do
                 player_checkname[i] = role[i][1] -- 从数组中获取玩家名称以供进一步检查
                 player_checkpnt[i] = role[i][2] -- 从数组中获取玩家点以供进一步检查
                 player_checkidpnt[i] = role[i][3] -- 从数组中获取玩家点以供进一步检查]]
             -- 这是获取值的正确代码吗?
            end
        else
            print ('You dont earn any points')
        end
    end

    detectroles("jack") -- 这是调用函数,以检查名为jack的名称是否在数组中或不在

这真的可能吗?如果有更简单或更少的代码方式,请让我知道。我知道,这是太多代码了。我还是一个新手

点赞
用户2505965
用户2505965

你似乎正在寻找一些通用的数据结构函数,称为 filter(有时称为 select)和 reduce


filter是一个简单的函数,它在一组值上操作,创建一个只包含符合所提供谓词的新集合。 filter 的实现非常直观:

  • 创建一个新的空集合
  • 遍历现有集合,读取每个值
  • 将任何通过测试的值推入新集合中

操作的结果是新的集合。

在Lua中:

local function filter (list, test)
    local result = {}

    for index, value in ipairs(list) do
        if test(value, index) then
            result[#result + 1] = value
        end
    end

    return result
end

我们可以使用此函数来获取过滤后的值集,其中每个表中的第一个条目是 'michael'

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

local filtered_set = filter(set, function (person)
    return person[1] == 'michael'
end)

for _, person in ipairs(filtered_set) do
    print(unpack(person))
end

--[[stdout:
  michael   40  2
  michael   50  3
]]

reduce是一个函数,通过迭代一组值来累积单个值。 reduce 通常允许提供初始值,否则初始值为集合中的第一个值。

在Lua中:

local function reduce (set, action, initial_value)
    local result
    local index

    if initial_value ~= nil then
        result = initial_value
        index = 1
    else
        result = set[1]
        index = 2
    end

    for i = index, #set do
        result = action(result, set[i], i)
    end

    return result
end

我们可以使用它来确定集合条目的合并值:

local value = reduce(filtered_set, function (score, next_entry)
    return score + next_entry[2] -- 注意不要依赖字符串形式的数学运算
end, 0)

print(value) --> 输出 90

虽然这些函数不在 Lua 标准库中,但它们是非常常见的 functional set 操作,并了解如何实现它们(以及其他类似的函数,如eachmaprejectcountindexhasfind)将教您很多关于处理数据结构的知识。

尝试考虑它们如何适合您当前的代码。

2016-11-09 04:05:53