如何移动表中的所有元素?

时间:2014-03-04 23:50:05

标签: lua indexing shift lua-table

我正在尝试一种简单的方法来使表中的所有元素都向上移动一个。这是我正在玩的游戏,试图在表格中的所有目标之间切换!

例如,假设我被三个想要杀死我的人所包围,所以我将所有这些都作为目标,然后将它们添加到一个数组中:

{
  "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,它就可以工作。我确信有更智能,更有效的方法。有人可以对它进行打击吗?!

4 个答案:

答案 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

work the same方式。

答案 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