Есть в Lua функция объединения массивов? Чтобы из двух массивов
Код
t1 = {4, 5, 6}
t2 = {1, 2, 3, 6, 7, 8}
получить один:
Код
t = {1, 2, 3, 4, 5, 6, 7, 8}
?
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 01.02.2015
27.03.2015 10:33:44
могу ошибаться, конечно но, нет.
однако, чтобы это сделать можно воспользоваться метаметодом "Add"
Пользователь
Сообщений: Регистрация: 01.02.2015
27.03.2015 10:38:34
Пользователь
Сообщений: Регистрация: 01.02.2015
27.03.2015 10:41:05
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2015 12:35:53
Цитата
Серж пишет: Есть в Lua функция объединения массивов? Чтобы из двух массивов
Код
t1 = {4, 5, 6}
t2 = {1, 2, 3, 6, 7, 8}
получить один:
Код
t = {1, 2, 3, 4, 5, 6, 7, 8}
?
вариантов море.
можно просто добавить поля из t2 в t1
function table.or(t1,t2) for k,v in pairs(t2) do t1[k] = v end return t1 end если исходные массивы портить не надо, тогда
table.or( table.or( {},t1 ),t2)
если речь идет именно о матрицах целочисленными индексами, тогда несколько сложнее, но ненамного. Если обрисуете точнее задачу, зачем вам это нужно, наверняка решение будет простейшим.
А разве при этом по меньшей мере часть элементов массива t1 не будет затерта значениями элементов из массива t2? Или диапазон индексов k, возвращаемый функцией pairs, для каждого массива всегда уникален?
s_mike@rambler.ru пишет: for k,v in pairs(t2) do t1[k] = v end
А разве при этом по меньшей мере часть элементов массива t1 не будет затерта значениями элементов из массива t2? Или диапазон индексов k, возвращаемый функцией pairs, для каждого массива всегда уникален?
Задача поставлена расплывчато. Функция table.or - это для ассоциативных таблиц. Для целочисленных матриц надо написать иначе, но как именно - это после конкретизации, что именно требуется
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.03.2015 14:21:34
Задача следующая: Есть два массива с целочисленными индексами, элементами которых являются числа, отсортированные в порядке возрастания. Нужно объединить их таким образом, чтобы результирующий массив содержал все элементы из обоих массивов без дубликатов, отсортированные также в порядке возрастания значения. Задача осложняется тем, что исходные массивы портить не надо. Иначе бы я использовал table.insert() для вставки новых элементов из одного массива в другой. Поэтому решил задачу следующим способом:
Код
function table.join(tab1, tab2)
-- Объединение массивов
-- Значениями массивов могут быть только числа
local tab, n1, n2, index = {}, #tab1, 1, 0
for i = 1, n1 do
local v1 = tab1[i]
for j = n2, #tab2 do
local v2 = tab2[j]
if v2 < v1 or i == n1 then
index = index + 1
tab[index] = v2
else
index = index + 1
tab[index] = v1
if v2 == v1 then n2 = j + 1 break
elseif i < n1 then n2 = j break end
end
end
end
return tab
end
А на table.or() Lua ругается.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2015 15:35:47
Мудрено.Вот попробуйте (я не проверял)
a={1,2,3,6,7,8} b={4,5,6,7}
c = {} for _,v in pairs(a) do table.insert(c,v) end for _,v in pairs(b) do table.insert(c,v) end
table.sort(c,function(x,y) return x < y end)
for i=#c,2,-1 do if c[i] == c[i-1] then table.remove(c,i) end end
такой вариант устроит: ----------------------------- for i=1,#b do a[#a+1]=b[i] end; table.sort(a); for i=2,#a do if a[i-1]==a[i] then a[i-1]=nil end end; table.sort(a);
Учитывая, что исходные массивы уже отсортированы, то можно использовать такой вариант:
Код
t1={1,2,3,6,7,8}
t2={1,3,5,7,8}
t = {}
local n2, n = 1, 0
for i = 1, #t1 do t[i] = t1[i] end
for i = 1, #t1 do
local v1 = t1[i]
for j = n2, #t2 do
local v2 = t2[j]
n = n + 1
if v2 < v1 then table.insert(t, n, v2)
else
if v2 > v1 then n2 = j
else n2 = j + 1 end
break
end
end
end
Но здесь используется три цикла обхода массивов, вместо двух. Попробую исправить свой первый вариант, чтобы работал правильно.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
30.03.2015 13:09:20
s_mike@rambler.ru, ваш вариант рабочий, но, думаю, будет медленнее моего последнего.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
30.03.2015 22:33:04
Немного поправлю последний вариант:
Код
tab = {}
local n1, n2, n = #tab1, 1, 0
for i = 1, n1 do tab[i] = tab1[i] end
for i = 1, n1 do
local v1 = tab1[i]
for j = n2, #tab2 do
local v2 = tab2[j]
n = n + 1
if v2 < v1 then table.insert(tab, n, v2)
elseif i == n1 then
if v2 > v1 then table.insert(tab, n, v2) end
else
if v2 > v1 then n2 = j else n2 = j + 1 end
break
end
end
end
Надо делать так, как надо. А как не надо - делать не надо.