基于选择插槽来移动Lua表中的对象的最有效方法是什么?

基于选择插槽来移动Lua表中的对象的最有效方法是什么?,lua,lua-table,Lua,Lua Table,我有一个对象表,用户可以按照表中的任何给定顺序选择表中的对象,并将其放置在表中的另一个插槽中。当这种情况发生时,我需要将表从选定的已删除插槽中移出并填充空插槽。不是交换,这很容易,而是在安置点上的转移 如果我把它作为我的表格的一个高度简化的例子 t = {a, b, c, d, e, f} 用户选择,比如说e,并希望将其放入插槽b。我该怎么做 让e使用b插槽 将从“b到d的所有值右移,然后再填充 空的e插槽 无论我选择了哪一个,在哪里,我将如何处理这个转变 无论桌子有多大,它都能有效地在桌子上

我有一个对象表,用户可以按照表中的任何给定顺序选择表中的对象,并将其放置在表中的另一个插槽中。当这种情况发生时,我需要将表从选定的已删除插槽中移出并填充空插槽。不是交换,这很容易,而是在安置点上的转移

如果我把它作为我的表格的一个高度简化的例子

t = {a, b, c, d, e, f}
用户选择,比如说
e
,并希望将其放入插槽
b
。我该怎么做

  • e
    使用
    b
    插槽
  • 将从“
    b
    d
    的所有值右移,然后再填充 空的
    e
    插槽
  • 无论我选择了哪一个,在哪里,我将如何处理这个转变 无论桌子有多大,它都能有效地在桌子上移动 可能是吧

  • 如果您想将位置
    的项目移动到您描述的位置
    ,您可以使用以下方法:

    table.insert(t, new, table.remove(t,old))
    
    以下是您的示例:

    t = {10,20,30,40,50,60}
    print(table.concat(t, ','))
    old = 5
    new = 2
    table.insert(t, new, table.remove(t,old))
    print(table.concat(t, ','))
    
    至于效率,上面的代码确实会在一些元素本可以保持在原来位置的情况下移动两次,但这可能并不重要,除非表很大


    在Lua 5.3中,您可能可以使用
    表做得更好。move

    下面是一个使用shift的实现,它在Lua 5.3中非常有效,如@lhf所述:

    function shift(t, old, new)
        local value = t[old]
        if new < old then
           table.move(t, new, old - 1, new + 1)
        else    
           table.move(t, old + 1, new, old) 
        end
        t[new] = value
    end
    
    功能转换(t、旧、新)
    本地值=t[旧]
    如果新的<旧的那么
    表.移动(t,新,旧-1,新+1)
    其他的
    表.移动(t,旧+1,新,旧)
    结束
    t[新]=值
    结束
    
    函数移动(t,旧,新)本地e=t[old];对于k=new,old,old>new和1或-1 do t[k],e=e,t[k]end end
    我正在使用Corona SDK进行拉米风格的游戏,我将使用它让玩家手动对手中的卡片进行排序。我相信他们正在使用LUA 5.1。我正在阅读LUA文档,也许我只是没有意识到这是一个如此简单的事实。感谢大家的提醒,我尝试了它,它工作得非常完美。它不是cle文档中的ar…是否在移动的链周围移动table.move reorder元素?如果是这样,它肯定会帮助我:它不会对任何内容进行重新排序,只是将多个值复制到一个新位置。对于您的问题,您可以使用move来移动值并创建移动段的副本。