基于选择插槽,将Lua表中的对象移位的最有效方式是什么?

我有一个对象的表格,并且用户可以在表格的任何位置选择一个对象,并将其放置在表格的另一个插槽中。当这种情况发生时,我需要表格从所选的丢弃槽位移并填充空槽。不是交换,那很容易,而是在放置点进行移位。

举个例子,如果我的表格是这样一个简化的例子:

t = {a, b, c, d, e, f}

并且用户选择了,比如说e,并想把它放到b插槽中。我该如何做:

  1. 将'e'放在'b'插槽中
  2. 将“b”到“d”的所有值向右移动,然后也填充空的“e”插槽?
  3. 无论选择哪一个和在表格中移动到哪里,我如何高效地处理这个移位,不管表格的大小如何?
点赞
用户107090
用户107090

如果您想按照您的描述将位置为old的项移动到位置为new,则可以使用以下代码:

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 中,您可以使用table.move来做得更好。

2015-08-26 13:35:39
用户2726734
用户2726734

以下是使用 table.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
2015-08-26 15:10:32