Объединение массивов

Страницы: 1
RSS
Объединение массивов
 
Есть в Lua функция объединения массивов?
Чтобы из двух массивов
Код
t1 = {4, 5, 6} 
t2 = {1, 2, 3, 6, 7, 8}
получить один:
Код
t = {1, 2, 3, 4, 5, 6, 7, 8}
?
Надо делать так, как надо. А как не надо - делать не надо.
 
могу ошибаться, конечно но, нет.

однако, чтобы это сделать можно воспользоваться метаметодом "Add"
 
http://lua-users.org/wiki/MetamethodsTutorial
 
http://quik2dde.ru/viewtopic.php?id=135
 
Цитата
Серж пишет:
Есть в 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)

если речь идет именно о матрицах целочисленными индексами, тогда несколько сложнее, но ненамного. Если обрисуете точнее задачу, зачем вам это нужно, наверняка решение будет простейшим.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru пишет:
for k,v in pairs(t2) do
t1[k] = v
end
А разве при этом по меньшей мере часть элементов массива 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 - это для ассоциативных таблиц.  Для целочисленных матриц надо написать иначе, но как именно - это после конкретизации, что именно требуется
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Задача следующая:
Есть два массива с целочисленными индексами, элементами которых являются числа, отсортированные в порядке возрастания.
Нужно объединить их таким образом, чтобы результирующий массив содержал все элементы из обоих массивов без дубликатов, отсортированные также в порядке возрастания значения.
Задача осложняется тем, что исходные массивы портить не надо. Иначе бы я использовал 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 ругается.
Надо делать так, как надо. А как не надо - делать не надо.
 
Мудрено.Вот попробуйте (я не проверял)



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

print(unpack©)
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
последняя строчка

print(unpack( c ) )
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
такой вариант устроит:
-----------------------------
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);
 
Цитата
s_mike@rambler.ru пишет:
Мудрено.
К тому же и работает не правильно...

Цитата
Николай Камынин пишет:
такой вариант устроит:
Нет:
Цитата
Серж пишет:
исходные массивы портить не надо.

Учитывая, что исходные массивы уже отсортированы, то можно использовать такой вариант:
Код
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
Но здесь используется три цикла обхода массивов, вместо двух.
Попробую исправить свой первый вариант, чтобы работал правильно.
Надо делать так, как надо. А как не надо - делать не надо.
 
s_mike@rambler.ru, ваш вариант рабочий, но, думаю, будет медленнее моего последнего.
Надо делать так, как надо. А как не надо - делать не надо.
 
Немного поправлю последний вариант:
Код
  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
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: 1
Читают тему
Наверх