在Lua表中如何交换值?

4
如何交换表中的值并将其替换为另一个值?例如:
local TestTable = {1, 2, 3, 4, 5}
local SwappedTestTable = TestTable:Swap(2, 4)
for i, v in pairs(TestTable) do
    print(v)
end

-- Output = 1, 4, 3, 2, 5

这是我尝试过的,结果惨不忍睹。
local TestTable = {1, 2, 3, 4, 5}

function Swap(Table, Pos1, Pos2)
    local Table = Table
    local Item1 = Table[Pos1]
    local Item2 = Table[Pos2]
    
    table.remove(Table, Pos1)
    table.insert(Table, Pos2, Item1)
    
    table.remove(Table, Pos2)
    table.insert(Table, Pos1, Item2)
    
    return Table
end

for _, v in pairs(Swap(TestTable, 2, 4)) do
    print(v)
end
1个回答

3
这是我尝试过的,但失败得很惨。
一个有趣的解决方案,但存在重大问题:
1. 它无法处理`table.insert`和`table.remove`调用引起的索引移位,导致后续的`table.insert`和`table.remove`调用操作错误的索引(虽然可以修复)。 2. 它需要线性时间(由于前面提到的索引移位),对于这样一个基本操作来说是不可接受的。 3. 过于复杂。
如何在表格中交换值并将其替换为另一个值?
我只需获取两个值并将它们设置为各自的“其他”索引,以常数时间交换值。
function Swap(Table, Pos1, Pos2)
    local tmp = Table[Pos1]
    Table[Pos1] = Table[Pos2]
    Table[Pos2] = tmp
    return Table
end

Lua允许您使用“多重赋值”更加简洁地编写代码:
function Swap(Table, Pos1, Pos2)
    Table[Pos1], Table[Pos2] = Table[Pos2], Table[Pos1]
    return Table
end

在这种情况下,Swap函数变得多余了,因为它几乎没有比每次写下赋值更短或更简洁。
注:
  1. 如果您想以面向对象的方式使用Swap函数(例如Table:Swap(i, j)),则必须分配元表。 local metatable = {__index = {Swap = Swap}}; setmetatable(Table, metatable) 可以实现这一点。
  2. 为什么Swap函数会返回Table?这只对某些语法糖(例如与pairs一起链接)有用,并且可能在区分语句和表达式的语言中出现意外。
  3. 再次强调,我可能不会使用函数来完成此操作(特别是考虑到需要require函数或全局命名空间污染),而是直接使用赋值Table[i], Table[j] = Table[j], Table[i]
  4. 您的命名约定(我已经在本文中遵循)有些令人困惑;在Lua中,UpperCamelCase通常用于类和元表名称,而不是函数和(表)变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接