Массив lua содержит конкретное значение для дальнейшей проверки

Извините, если я беспокою вас сейчас, я все еще учусь. но мне нужна помощь Не могли бы вы исправить меня и написать скрипт, как проверить, а затем получить значение массива 2d для дальнейшей проверки и подсчета очков?

Пример синтаксиса array2d, который я строю:

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

Пример значения array2d, которое я делаю:

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

что я хотел когда я ищу имя "Майкл". он обнаружит значение в массиве. что-то вроде этого

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
            -- We grab the first index of our sub-table instead for player name
            if value[1] == val then
                return true
            end
        end
        return false
    end

    function check_role2(tab, val)
        for index, value in ipairs (tab) do
            -- We grab the third index of our sub-table instead for index point
            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] -- Get Player Name From Array for checking further
                 player_checkpnt[i] = role[i][2] -- Get Player Point From Array for checking further
                 player_checkidpnt[i] = role[i][3] -- Get Player Point From Array for checking further]]
             -- is this correct code to get value ?
            end
        else
            print ('You dont earn any points')
        end
    end

    detectroles("jack") -- this is call function, for checking name jack if he is in array or not

это действительно возможно? если есть простой способ или более менее кода, дайте мне знать. я знаю, это слишком много кода. я все еще новичок

1 ответ

Решение

То, что вы, похоже, ищете, это некоторые общие функции структуры данных, известные как 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] -- Careful with relying on stringly-math
end, 0)

print(value) --> prints 90

Хотя они отсутствуют в стандартной библиотеке Lua, они являются очень распространенными операциями с функциональными множествами и изучают, как их реализовывать (и другие подобные each, map, reject, count, index, has, find) научит вас много о работе со структурами данных.

Попробуйте подумать о том, как они вписались бы в ваш текущий код.

Другие вопросы по тегам