2015-08-26 2 views
3

У меня есть таблица объектов, и пользователь может выбрать объект в таблице в любом заданном порядке в таблице и поместить его в другой слот в таблице. Когда это произойдет, мне нужно, чтобы таблица переключилась с выбранного слота и заполнила пустой слот. Не своп, это легко, но сдвиг в месте размещения.Что было бы самым эффективным способом переноса объектов в таблице Lua на основе выбора слота?

так что если у меня есть это как очень упрощенный пример моего стола

t = {a, b, c, d, e, f} 

и пользователь выбирает, скажем e, и хочет, чтобы поместить его в слот b. как лучше бы я

  1. имеет e взять слот b
  2. имеет все значения "b для d сдвига вправо, а затем также заполнить пустой e слот?
  3. как бы я справиться с этим смещением нет независимо от того, какой из них выбран и где его перемещение в таблице эффективно независимо от размера стола может быть?
+0

'функция перемещение (т, старый, новый) местные е = т [старый]; для k = new, old, old> new и 1 или -1 do t [k], e = e, t [k] end end' –

ответ

2

Если вы хотите, чтобы переместить элемент в позиции old позиционировать new, как вы описываете, вы можете использовать это:

table.insert(t, new, table.remove(t,old)) 

Вот ваш пример:

t = {10,20,30,40,50,60} 
print(table.concat(t, ',')) 
old = 5 
new = 2 
table.insert(t, new, table.remove(t,old)) 
print(table.concat(t, ',')) 

Что касается эффективности, то код выше делает сдвинуть некоторые элементы дважды, когда они могли бы остаться там, где они были, но это, вероятно, не имеет значения, если таблица не будет огромной.

В Lua 5.3 вы можете сделать что-то лучше с table.move.

+0

Я использую Corona SDK для игры в стиле Rummy, и я собираюсь используйте это, чтобы игрок мог сортировать карты в руке вручную. и я считаю, что они используют LUA 5.1. Я читал документы lua, и, возможно, я просто не обмолвился о том, что все было так просто. Спасибо за головы, я попробовал, и он отлично работает. – gamedesigngeek

3

Вот осуществление сдвига с использованием table.move, который является эффективным и доступен в Lua 5.3, как упоминалось @lhf:

function shift(t, old, new) 
    local value = t[old] 
    if new < old then 
     table.move(t, new, old - 1, new + 1) 
    else  
     table.move(t, old + 1, new, old) 
    end 
    t[new] = value 
end 
+0

Непонятно из документации ... Does table.move переупорядочивает элементы вокруг перемещенной цепи? Если это так, это мне поможет: http://stackoverflow.com/questions/32130855/lua-dragging-sequence-of-elements-within-array – Aubergine18

+1

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