Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Сложение внутри массива, Сложение одинаковых значений
handness
сообщение 23.10.2021, 20:51
Сообщение #1


**

Neophyte
Сообщений: 27
Регистрация: 25.7.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.026
Возраст: 28



Имеем такой массив
Код
--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

Сумма значений осталась та же но из-за слияния одинаковых количество строк уменьшилось. Помогите пожалуйста это реализовать
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 24.10.2021, 0:12
Сообщение #2


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



код
Код

--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


Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
handness
сообщение 24.10.2021, 8:37
Сообщение #3


**

Neophyte
Сообщений: 27
Регистрация: 25.7.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.026
Возраст: 28



Цитата(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



Это именно то что нужно, спасибо
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 26.10.2021, 22:21
Сообщение #4


**

Neophyte
Сообщений: 36
Регистрация: 19.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.051



Цитата(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]})

? И что из них работает быстрее?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 27.10.2021, 0:29
Сообщение #5


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8421
Пользователь №: 19.451
Возраст: 32



Потому что оба варианта рабочие, использовать можно так же оба, в скорости скорей всего на малых объемах данных разницы не будет, при больших на сколько помню table.insert() не много медленнее.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 28.10.2021, 11:43
Сообщение #6


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



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

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

А при очень больших объёмах данных использовать insert будет очень медленно, надо отдельно создавать реальный индекс.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 29.10.2021, 10:42
Сообщение #7


**

Neophyte
Сообщений: 36
Регистрация: 19.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.051



Цитата(sutra @ 28.10.2021, 11:43) *

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

Всегда хочется научиться "по уму" (IMG:style_emoticons/default/biggrin.gif). Может дадите мастер-класс?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
pioner
сообщение 17.11.2021, 8:03
Сообщение #8


*

Registred
Сообщений: 3
Регистрация: 9.11.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.124
Возраст: 32



А можно пример на языке пилота? Спасибо
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 17.4.2024, 0:20
Designed by Nickostyle