如何交换 lua 表中的值?

How do you swap values in lua tables?

如何交换 table 中的值并将其交换为不同的值?例如:

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

This is what I've tried and it failed horrendously.

一个有趣的解决方案,但受到主要问题的困扰:

  1. 它无法处理 table.inserttable.remove 调用导致的索引偏移,导致后来的 table.inserttable.remove 调用对错误的索引进行操作(这虽然可以修复)
  2. 需要线性时间(由于上述索引偏移),对于这样的基本操作来说是不可接受的table。
  3. 太复杂了。

How would you swap a value in a table and exchange it for a different one?

我会简单地获取这两个值并将它们设置为各自的“其他”索引,在恒定时间内交换值:

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. 如果您希望能够以 OOP 方式使用 Swap 函数 (Table:Swap(i, j)),则必须分配元 table。 local metatable = {__index = {Swap = Swap}}; setmetatable(Table, metatable) 将为此工作。
  2. 为什么 Swap 函数 return Table?这仅对某些语法糖有用(链接,f.E。在您的示例中使用 pairs),并且在区分语句和表达式的语言中可能出乎意料。
  3. 同样,我可能不会为此使用函数(特别是考虑到 require 函数所需的代码或全局命名空间污染,否则您需要使其可用),而是 只需使用作业 Table[i], Table[j] = Table[j], Table[i].
  4. 您的命名约定(我在本 post 中坚持使用)有点令人不快; UpperCamelCase 通常用于 class 和 Lua 中的元table 名称,而不是函数和 (table) 变量。