Lua: 在数组中拖动一系列元素

我正在尝试创建一个函数,该函数可以将一系列连续的元素“拖动”到数组中的新位置,限制为数组的当前大小。其他项应该在“拖拉”项周围晃动。

例如,如果我的数组有7个元素,我想拖动中间的三个...

1, 2, 3, 4, 5, 6, 7  <-- 键
a, b, C, D, E, f, g  <-- 值

大写字母是我想要“拖动”的字母。如果我拖动到数组的开头(拖到1),则数组将如下所示:

1, 2, 3, 4, 5, 6, 7  <-- 键
C, D, E, a, b, f, g  <-- 值

如果我拖到位置5(或以上-无法拖动到当前数组大小之外),则数组将如下所示:

1, 2, 3, 4, 5, 6, 7  <-- 键
a, b, f, g, C, D, E  <-- 值

有什么办法可以用Lua实现这一目标而不显得太复杂?

点赞
用户1847592
用户1847592
function drag(t, src, len, dest)
  if len == 0 then return end
  local left, ctr, start, index, elem = math.min(src, dest), 0, 0
  local rot, size = dest - src, src + dest + len - 2 * left
  repeat
    start, index, elem = start + 1, start, t[left + start]
    repeat
      index = (index + rot) % size
      ctr, t[left + index], elem = ctr + 1, elem, t[left + index]
    until index < start
  until ctr == size
end

for K = 1, 5 do
  local tbl = {'a', 'b', 'C', 'D', 'E', 'f', 'g'}
  drag(tbl, 3, 3, K)
  print(table.concat(tbl))
end

函数drag(t,src,len,dest)实现了将表t中从索引src开始长为len的一段取出来,然后插入到以索引dest为起始的位置上,其它元素向前或向后平移以保证整个表长不变且元素不重复。

for循环遍历了 1 到 5 这 5 个数字,每次都对同一个表进行以上操作,然后将操作后的表输出。

2015-08-21 04:24:26
用户2726734
用户2726734

以下是使用 Lua 5.3 中 table.move 函数的版本。

该函数将需要拖动的数据组复制到另一个表中,并改变值的位置以腾出空间让拖动的组插入。

function drag(t, src, len, dest)
    local copy = table.move(t, src, src + len - 1, 1, {})

    if src >= dest then
        table.move(t, dest, src - 1, dest + len)
    else
        table.move(t, src + len, dest + len - 1, src)
    end

    table.move(copy, 1, len, dest, t)
end
2015-08-26 17:13:45