我正在尝试一种简单的方法来使表中的所有元素都向上移动一个。这是我正在玩的游戏,试图在表格中的所有目标之间切换!
例如,假设我被三个想要杀死我的人所包围,所以我将所有这些都作为目标,然后将它们添加到一个数组中:
{
"mook1",
"mook2",
"mook3",
}
我希望函数做的是将所有索引更改为一个(或我指定的数量),最后一个转到开头,因此最终结果将是:
{
"mook3",
"mook1",
"mook2",
}
我自己尝试使用这样一个简单的函数:
local function nextIndex(tbl, amount)
local t = {}
for k,v in ipairs(tbl) do
if k < #tbl then
t[k+amount] = v
else
t[1] = v
end
end
return t
end
只要金额设置为1,它就可以工作。我确信有更智能,更有效的方法。有人可以对它进行打击吗?!
答案 0 :(得分:2)
我工作了一点,想出怎么做。这是代码:
local function nextIndex(tbl, amount)
local t = {}
local i
for k,v in ipairs(tbl) do
i = k + amount
if i <= #tbl then
t[i] = v
else
t[i-#tbl] = v
end
end
return t
end
虽然有更简单的方法吗?
答案 1 :(得分:2)
您可以使用以下功能:
function wrap( t, l )
for i = 1, l do
table.insert( t, 1, table.remove( t, #t ) )
end
end
您可以在codepad上看到测试运行。或者,如果你对函数调用的嵌套感到不舒服;
function wrap( t, l )
for i = 1, l do
table.insert( t, 1, t[#t] )
table.remove( t, #t )
end
end
答案 2 :(得分:1)
因此,任务是将最后的腐烂物品旋转到前面。
我添加了参数n以允许覆盖由#t。
确定的序列结束-- uses t[#t+1]...t[#t+rot%#t] as scratch space
local function rotate_mod(t, rot, n)
n = n or #t
rot = rot % n
if rot == 0 then return t end
for i = n, 1, -1 do
t[i + rot] = t[i]
end
for i = 1, rot do
t[i], t[i + n] = t[i + n]
end
return t
end
或者如果你想要一个新数组(只是忽略参数r):
local function rotate_new(t, rot, n, r)
n, r = n or #t, {}
rot = rot % n
for i = 1, rot do
r[i] = t[n - rot + i]
end
for i = rot + 1, n do
r[i] = t[i - rot]
end
return r
end
答案 3 :(得分:1)
这是一个真正的“就地”版本。它不需要暂时放大表格:
local function reverse(t, i, j)
while i < j do
t[i], t[j] = t[j], t[i]
i, j = i+1, j-1
end
end
local function rotate_inplace(t, d, n)
n = n or #t
d = (d or 1) % n
reverse(t, 1, n)
reverse(t, 1, d)
reverse(t, d+1, n)
end