【问题标题】:How to shift all elements in a table?如何移动表格中的所有元素?
【发布时间】:2014-04-06 19:09:56
【问题描述】:

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

例如,假设我被三个想要杀死我的 mooks 包围,所以我将它们全部作为目标并将它们添加到一个数组中,如下所示:

{
  "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,它就可以工作。我相信有一种更智能、更有效的方法来做到这一点。有没有人可以试试看?!

【问题讨论】:

  • for i = 1, amount do table.insert(tbl, 1, table.remove(tbl)) end

标签: lua indexing shift lua-table


【解决方案1】:

你可以使用这样的函数:

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】:

    我做了更多的工作并想出了如何去做。这是代码:

    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
    

    有没有更简单的方法呢?

    【讨论】:

      【解决方案3】:

      所以,任务是将最后一个腐烂的物品旋转到最前面。

      我添加了参数 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
      

      【讨论】:

        【解决方案4】:

        这是一个真正的“就地”版本。暂时不需要放大表格:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多