Как я могу узнать, сколько раз была указана запись в таблице? - PullRequest
1 голос
/ 05 июня 2019

Мне нужно найти способ узнать, сколько раз запись указана в таблице.

Я пытался найти другой код для получения справки и найти примеры в Интернете, но ни один из них не помог

local pattern = "(.+)%s?-%s?(.+)"

local table = {"Cald_fan:1", "SomePerson:2", "Cald_fan:3","anotherPerson:4"}

for i,v in pairs(table) do
    local UserId, t = string.match(v, pattern)

    for i,v in next,UserId do
        --I have tried something like this
    end
end

предполагается, что Cald_fan был указан 2 раза

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Примерно так должно работать:

local pattern = "(.+)%s*:%s*(%d+)"
local tbl = {"Cald_fan:1", "SomePerson:2", "Cald_fan:3","anotherPerson:4"}
local counts = {}

for i,v in pairs(tbl) do
    local UserId, t = string.match(v, pattern)
    counts[UserId] = 1 + (counts[UserId] or 0)
end
print(counts['Cald_fan']) -- 2

Я переименовал table в tbl (так как использование переменной table делает таблицу. * Функции недоступными) и исправил шаблон (у вас был unescaped '-' в нем, в то время как в ваших строках было ':') .

0 голосов
/ 05 июня 2019

Если формат записей вашей таблицы согласован, вы можете просто разделить строки и использовать компоненты в качестве ключей на карте счетчиков.

Похоже, что записи вашей таблицы отформатированы как "[player_name]: [index]", но это не похоже на то, что вы заботитесь об индексе. Но если «:» будет в каждой записи таблицы, вы можете написать довольно надежный шаблон поиска. Вы можете попробовать что-то вроде этого:

-- use a list of entries with the format <player_name>:<some_number>
local entries = {"Cald_fan:1", "SomePerson:2", "Cald_fan:3","anotherPerson:4"}
local foundPlayerCount = {}

-- iterate over the list of entries
for i,v in ipairs(entries) do
    -- parse out the player name and a number using the pattern :
    -- (.+) = capture any number of characters
    -- :    = match the colon character
    -- (%d+)= capture any number of numbers 
    local playerName, playerIndex = string.match(v, '(.+):(%d+)')

    -- use the playerName as a key to count how many times it appears
    if not foundPlayerCount[playerName] then
        foundPlayerCount[playerName] = 0
    end
    foundPlayerCount[playerName] = foundPlayerCount[playerName] + 1
end

-- print out all the players
for playerName, timesAppeared in pairs(foundPlayerCount) do
    print(string.format("%s was listed %d times", playerName, timesAppeared))
end

Если в будущем вам потребуется выполнить сопоставление с образцом, я настоятельно рекомендую эту статью о шаблонах строк lua: http://lua -users.org / wiki / PatternsTutorial

Надеюсь, это поможет!

...