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

 
Ответить в эту темуОткрыть новую тему
> Сравнение массивов, Сравнение массивов
handness
сообщение 21.10.2021, 23:31
Сообщение #1


**

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



Имеем 2 массива
Первый
Код
--lua
local stati = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150},
{11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151}
}


И второй
Код
--lua
local arr = {11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151}


Нужно сравнить каждый массив из двумерного с обычным, и если будет совпадение, присвоить переменной
Код
numst
порядковый номер совпавшего массива (он находится внутри двумерного).

Не получается.
Пишу
Код
--lua
local х = 0
for j=1, #stati do
    for i=1, #stati[j] do
        if  stati[j][i] == arr[i] then
            local x = x + 1
        end
        local numst = (j)
        if  x == #stati[j] then
            if numst == 1 then
                log "Совпал 1й массив"
            else
                if numst == 2 then
                    log "Совпал 2й массив"
                else
                    if numst == 3 then
                        log "Совпал 3й массив"
                    end
                end
            end
        else
            log ("Пусто")
            х = 0
        end
    end
end


Получаю ошибку
Код
a runtime error.
893: attempt to perform arithmetic on global 'x' (a nil value)
--lua
log 'clear' log 'mode compact'
local result = 0
local stati = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},


Подозреваю что ошибка в моменте когда j записываю в переменную но как исправить не знаю. Помогите разобраться пожалуйста.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 22.10.2021, 1:55
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26707
Пользователь №: 16.971
Возраст: 29



Цитата
attempt to perform arithmetic on global 'x' (a nil value)

Эта ошибка означает что переменной x не существует. Не нужно путать русскую 'х' и англ. 'x'.
Код
--lua
local stati = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150},
{11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151}
}

local arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}

log 'clear' log 'mode compact'
for j=1, #stati do
    local x = 0
    for i=1, #stati[j] do
        if  stati[j][i] == arr[i] then
            x = x + 1
        end
        if  x == #stati[j] then
            log ("Совпал " .. tostring(j) .. "й массив")
        end
    end
end
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
handness
сообщение 22.10.2021, 2:18
Сообщение #3


**

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



Цитата(cirus @ 22.10.2021, 1:55) *

Эта ошибка означает что переменной x не существует. Не нужно путать русскую 'х' и англ. 'x'.
Код
--lua
local stati = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150},
{11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151}
}

local arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}

log 'clear' log 'mode compact'
for j=1, #stati do
    local x = 0
    for i=1, #stati[j] do
        if  stati[j][i] == arr[i] then
            x = x + 1
        end
        if  x == #stati[j] then
            log ("Совпал " .. tostring(j) .. "й массив")
        end
    end
end


А ларчик просто открывался. Коварная ошибка. Спасибо. Но тем не менее, это
Код
if  x == #stati[j] then
            log ("Совпал " .. tostring(j) .. "й массив")
        end
не совсем то, что нужно. В зависимости от того какой массив совпадет, будут предприняты разные действия. Как можно написать "если совпал 1й, если совпал 2й, если совпал 3й"...? Встроить условие в проверку
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 22.10.2021, 2:24
Сообщение #4


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26707
Пользователь №: 16.971
Возраст: 29



Код
--lua
local stati = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150},
{11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151}
}

local arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}

log 'clear' log 'mode compact'
for j=1, #stati do
    local x = 0
    for i=1, #stati[j] do
        if  stati[j][i] == arr[i] then
            x = x + 1
        else
            break
        end
    end
    if  x == #stati[j] then
        if j == 1 then
            log ("Совпал 1")
        elseif j == 2 then
            log ("Совпал 2")
        elseif j == 3 then
            log ("Совпал 3")
        end
    end
end
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
handness
сообщение 22.10.2021, 6:49
Сообщение #5


**

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



Цитата(cirus @ 22.10.2021, 2:24) *

Код
--lua
local stati = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150},
{11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151}
}

local arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}

log 'clear' log 'mode compact'
for j=1, #stati do
    local x = 0
    for i=1, #stati[j] do
        if  stati[j][i] == arr[i] then
            x = x + 1
        else
            break
        end
    end
    if  x == #stati[j] then
        if j == 1 then
            log ("Совпал 1")
        elseif j == 2 then
            log ("Совпал 2")
        elseif j == 3 then
            log ("Совпал 3")
        end
    end
end


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


**

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



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

Помогите, пожалуйста, добавить в скрипт следующее условие: если длина массива arr == stati[j] то делаем всё как обычно (сравниваем содержимое массивов), если (длина arr > длины stati[j]) или (длина arr < длины stati[j]) то считаем сравниваемые массивы разными.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 22.10.2021, 12:48
Сообщение #7


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26707
Пользователь №: 16.971
Возраст: 29



Код
--lua
local stati = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150},
{11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151}
}

local arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}

log 'clear' log 'mode compact'
for j=1, #stati do
    local x = 0
    if #arr == #stati[j] then    -- если размер массивов совпадает
        for i=1, #stati[j] do
            if  stati[j][i] == arr[i] then
                x = x + 1
            else
                break
            end
        end
        if  x == #stati[j] then
            if j == 1 then
                log ("Совпал 1")
            elseif j == 2 then
                log ("Совпал 2")
            elseif j == 3 then
                log ("Совпал 3")
            end
        end
    end
end
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
handness
сообщение 22.10.2021, 20:07
Сообщение #8


**

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



Цитата(cirus @ 22.10.2021, 12:48) *

Код
--lua

log 'clear' log 'mode compact'
for j=1, #stati do
    local x = 0
    if #arr == #stati[j] then    -- если размер массивов совпадает
        for i=1, #stati[j] do
            if  stati[j][i] == arr[i] then
                x = x + 1
            else
                break
            end
        end



И тут так просто не вышло. Видимо, не надо было упрощать пример для форума. Проблема в том, что этот кусочек кода сравнивает длину строк, а у меня данные находятся не в строчке arr, а в третьем столбце и имеют вид arr[i][3]. Можно ли таким же образом как-то сравнить длину массива (строчки) #stati[j] с "высотой" столбца arr[i][3]?

Может можно перед сравнением создать дополнительный как бы переходный массив и переписать в него данные "в строчку" из третьего столбца (arr[i][3])?

UPD: решено записью столбика в строчку
Код
local sravnenie = {}

    for k=1, #stat1 do
        table.insert(sravnenie, stat1[k][3])
    end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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