Помощь - Поиск - Пользователи - Календарь
Полная версия: Сложение внутри массива
UoKit.com Форумы > Кликер > UO Pilot
handness
Имеем такой массив
Код
--lua
log 'mode compact' log 'clear'

local s1slot = "Картофель"
local s2slot = "Морковь"
local s3slot = "Брюква"
local s4slot = "Морковь"
local s5slot = "Брюква"

local r1slot = 17
local r2slot = 5
local r3slot = 100
local r4slot = 21
local r5slot = 24

arr = {
{s1slot, r1slot},
{s2slot, r2slot},
{s3slot, r3slot},
{s4slot, r4slot},
{s5slot, r5slot}
}


В первом столбце текстовые данные, во втором числа.
Нужно проверить первый столбец на совпадение всех данных между собой, и в случае совпадения просуммировать соответствующие строки из второго столбца. Результат записать в переменную по каждому значению.
Должно получиться вроде этого

kartofel = 17
morkov = 26
brukva = 124

Сумма значений осталась та же но из-за слияния одинаковых количество строк уменьшилось. Помогите пожалуйста это реализовать
sutra
код
Код

--lua
log 'mode compact' log 'clear'

local s1slot = "Картофель"
local s2slot = "Морковь"
local s3slot = "Брюква"
local s4slot = "Морковь"
local s5slot = "Брюква"

local r1slot = 17
local r2slot = 5
local r3slot = 100
local r4slot = 21
local r5slot = 24

arr = {
{s1slot, r1slot},
{s2slot, r2slot},
{s3slot, r3slot},
{s4slot, r4slot},
{s5slot, r5slot}
}

-- далее действия
local arrRes={}  -- Инициализация результирующего массива
for i=1,#arr do  -- Цикл анализа исходного массива от начала до конца
  local resultFind1=false  -- Объявление и инициализация флага признака уже имеющегося 1-го элемента (сброс)
  for j=1,#arrRes do       -- Цикл анализа результирующего массива
    if arr[i][1]==arrRes[j][1] then  -- Если первые элементы двух массивов идентична
      resultFind1=true               -- установка флага признака уже имеющегося 1-го элемента
      arrRes[j][2]=arrRes[j][2]+arr[i][2]  -- Увеличение элемента результирующего массива 2-го уровня
    end
  end
  if not(resultFind1) then          -- Если первого элемента в результирующем массиве не было
    arrRes[#arrRes+1]={}            -- Добавление нового элемента результирующего массива
    arrRes[#arrRes][1]=arr[i][1]
    arrRes[#arrRes][2]=arr[i][2]
  end
end
for i=1,#arrRes do
  log(arrRes[i][1],arrRes[i][2])
end


handness
Цитата(sutra @ 24.10.2021, 0:12) *

код
Код

--lua
log 'mode compact' log 'clear'

local s1slot = "Картофель"
local s2slot = "Морковь"
local s3slot = "Брюква"
local s4slot = "Морковь"
local s5slot = "Брюква"

local r1slot = 17
local r2slot = 5
local r3slot = 100
local r4slot = 21
local r5slot = 24

arr = {
{s1slot, r1slot},
{s2slot, r2slot},
{s3slot, r3slot},
{s4slot, r4slot},
{s5slot, r5slot}
}

-- далее действия
local arrRes={}  -- Инициализация результирующего массива
for i=1,#arr do  -- Цикл анализа исходного массива от начала до конца
  local resultFind1=false  -- Объявление и инициализация флага признака уже имеющегося 1-го элемента (сброс)
  for j=1,#arrRes do       -- Цикл анализа результирующего массива
    if arr[i][1]==arrRes[j][1] then  -- Если первые элементы двух массивов идентична
      resultFind1=true               -- установка флага признака уже имеющегося 1-го элемента
      arrRes[j][2]=arrRes[j][2]+arr[i][2]  -- Увеличение элемента результирующего массива 2-го уровня
    end
  end
  if not(resultFind1) then          -- Если первого элемента в результирующем массиве не было
    arrRes[#arrRes+1]={}            -- Добавление нового элемента результирующего массива
    arrRes[#arrRes][1]=arr[i][1]
    arrRes[#arrRes][2]=arr[i][2]
  end
end
for i=1,#arrRes do
  log(arrRes[i][1],arrRes[i][2])
end



Это именно то что нужно, спасибо
apaul
Цитата(sutra @ 24.10.2021, 0:12) *


arrRes[#arrRes+1]={} -- Добавление нового элемента результирующего массива
arrRes[#arrRes][1]=arr[i][1]
arrRes[#arrRes][2]=arr[i][2]

Подскажите пожалуйста, почему так, а не
Код

table.insert(arrRes, {arr[i][1], arr[i][2]})

? И что из них работает быстрее?
Madeus
Потому что оба варианта рабочие, использовать можно так же оба, в скорости скорей всего на малых объемах данных разницы не будет, при больших на сколько помню table.insert() не много медленнее.
sutra
Поскольку вопрос был на ЛОГИКУ, поэтому я так тупо и дотошно расписал алгоритм действий.
Конечно намного эстетичней было бы использовать всего один оператор - arrRes[#arrRes+1]=arr[i]
который добавляет весь массив в последний элемент результирующего массива.

При больших объёмах данных, алгоритм приведённого мной примера никуда не годится. По уму, нужно индексировать результирующий массив, а не лопатить его каждый раз целиком. Вот тогда точно понадобится insert, но это отдельная тема.

А при очень больших объёмах данных использовать insert будет очень медленно, надо отдельно создавать реальный индекс.
apaul
Цитата(sutra @ 28.10.2021, 11:43) *

При больших объёмах данных, алгоритм приведённого мной примера никуда не годится. По уму, нужно индексировать результирующий массив, а не лопатить его каждый раз целиком. Вот тогда точно понадобится insert, но это отдельная тема.

Всегда хочется научиться "по уму" biggrin.gif. Может дадите мастер-класс?
pioner
А можно пример на языке пилота? Спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.