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

我正在想一个简单的方法来使表格中的所有元素上移一个位置。这是为了我正在玩的一个游戏,试图在表格中切换所有目标!

例如,假设我被三个想杀死我的家伙包围,所以我瞄准了他们所有人,他们就会像这样被添加到一个数组中:

{
  "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,它就可以工作。我确信有更聪明、更高效的方法来做到这一点。有人可以试试吗?

点赞
用户2488456
用户2488456

我再努力一点,想出来怎么做了。这就是代码:

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

但是有没有更简单的方法呢?

2014-03-04 23:54:54
用户1190388
用户1190388

您可以使用以下函数:

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

将以相同的方式工作(链接)。

2014-03-05 00:03:13
用户3204551
用户3204551

任务是将最后的 rot 个元素旋转到数组前面。

我添加了参数 n 以允许覆盖 #t 确定的序列结尾。

-- 使用 t[#t+1]...t[#t+rot%#t] 作为刮擦空间
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
2014-03-05 03:28:13
用户12048
用户12048

下面是一个 true "in-place" 版本。它不需要暂时扩大表格:

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
2014-03-05 14:44:47