Lua: "dragging" 数组中的元素序列
Lua: "dragging" sequence of elements within array
我正在尝试创建一个函数,该函数 'drags' 将顺序数量的元素添加到数组中的新位置,并限制为数组的当前大小。其他项目应围绕 'dragged' 项目。
例如,如果我的数组有 7 个元素,我想拖动中间三个...
1, 2, 3, 4, 5, 6, 7 <-- keys
a, b, C, D, E, f, g <-- values
大写字符是我想要的'drag'。如果我拖动到数组的开头(拖动到 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 实现吗?
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
这是一个使用 table.move
的版本,在 Lua 5.3 中可用。
它将要拖动的组复制到另一个 table 并向上或向下移动值以为该组腾出空间。
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
我正在尝试创建一个函数,该函数 'drags' 将顺序数量的元素添加到数组中的新位置,并限制为数组的当前大小。其他项目应围绕 'dragged' 项目。
例如,如果我的数组有 7 个元素,我想拖动中间三个...
1, 2, 3, 4, 5, 6, 7 <-- keys
a, b, C, D, E, f, g <-- values
大写字符是我想要的'drag'。如果我拖动到数组的开头(拖动到 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 实现吗?
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
这是一个使用 table.move
的版本,在 Lua 5.3 中可用。
它将要拖动的组复制到另一个 table 并向上或向下移动值以为该组腾出空间。
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