Lua:“拖动”数组中的元素序列

Posted

技术标签:

【中文标题】Lua:“拖动”数组中的元素序列【英文标题】:Lua: "dragging" sequence of elements within array 【发布时间】:2015-11-14 20:09:28 【问题描述】:

我正在尝试创建一个函数,将连续数量的元素“拖动”到数组中的新位置,并限制为数组的当前大小。其他项目应围绕“拖动”项目摆动。

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

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

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

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

如果我拖动到位置 5(或更高 - 不能被拖动到当前数组大小之外),数组将如下所示:

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

知道如何以简单的方式使用 Lua 实现这一目标吗?

【问题讨论】:

所涉及的表有多大?拖链有多大?我可以想到两种主要的方法来临时做到这一点,但它们扩展到更大的表格时会有所不同。 小表和链用于我想做的事情,但如果其他人使用代码,那么可能是带有大链的大表。 目前没有时间写出答案,但其中一个想法基本上就是获取您的起始索引并计数table.unpack(t, 1, start) + table.unpack(t, start + count) + table.unpack(t, start, start+count)(随便@ 987654327@/- 1 是必要的,以使其工作。虽然这需要循环工作。另一个重复 table.remove/table.insert 对。 【参考方案1】:

这是 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

【讨论】:

效果很好!尽管官方文档有些稀疏,但我开始意识到 table.move() 是一个非常灵活和有用的函数,尤其是考虑到它的内部优化。【参考方案2】:
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

【讨论】:

几乎 ;) 如果 src + len > dest 会中断,例如:for K = 1, 7 do local tbl = 'a', 'b', 'C', 'D ', 'E', 'f', 'g' 拖拽(tbl, 3, 3, K) print(table.concat(tbl)) end @Aubergine18 - 您正在尝试将选定的元素拖到数组之外;) 如果您希望检查这种情况,应添加断言 assert(math.max(src, dest) + len - 1 &lt;= #t)

以上是关于Lua:“拖动”数组中的元素序列的主要内容,如果未能解决你的问题,请参考以下文章

Lua中的数据结构

Lua 笔记

Lua数组Lua迭代器

lua中,数组子元素

Swift:像在 Lua 中一样快速从数组中删除元素

Lua用table实现各种数据结构-数组