Серж пишет: Есть в 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 - это для ассоциативных таблиц. Для целочисленных матриц надо написать иначе, но как именно - это после конкретизации, что именно требуется
Задача следующая: Есть два массива с целочисленными индексами, элементами которых являются числа, отсортированные в порядке возрастания. Нужно объединить их таким образом, чтобы результирующий массив содержал все элементы из обоих массивов без дубликатов, отсортированные также в порядке возрастания значения. Задача осложняется тем, что исходные массивы портить не надо. Иначе бы я использовал 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 ругается.
Надо делать так, как надо. А как не надо - делать не надо.
такой вариант устроит: ----------------------------- 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
Но здесь используется три цикла обхода массивов, вместо двух. Попробую исправить свой первый вариант, чтобы работал правильно.
Надо делать так, как надо. А как не надо - делать не надо.
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
Надо делать так, как надо. А как не надо - делать не надо.