lua - 你如何交换 lua 表中的值?

标签 lua

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

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. 它需要线性时间(由于上述索引偏移),这对于这样的基本操作来说是 Not Acceptable 。
  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)),您必须分配一个元表。 本地元表 = {__index = {Swap = Swap}}; setmetatable(Table, metatable) 将为此工作。
  2. 为什么 Swap 函数返回 Table?这仅对某些语法糖有用(链接,f.E. 与 pairs 在您的示例中)并且在区分语句和表达式的语言中可能是意想不到的。
  3. 同样,我可能不会为此使用函数(特别是考虑到要求函数所需的代码或全局命名空间污染,否则您需要使其可用),而是只需使用赋值 Table[i], Table[j] = Table[j], Table[i]
  4. 您的命名约定(我在这篇文章中坚持使用)有点令人不快; UpperCamelCase 通常用于 Lua 中的类和元表名称,而不是函数和(表)变量。

关于lua - 你如何交换 lua 表中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72068474/

相关文章:

python - 用于 bitstamp API 的 Lua 与 Python。 Python 代码有效但 Lua 无效。为什么?

c++ - 将 Lua 嵌入到与 C 混合的 C++ 中

lua - 对矩阵元素进行编号

android - 通过 luajava 获取 Android 系统设置

lua - 为什么 LuaJIT 从这个简单的代码中产生 "too many callbacks error"?

LUA:你如何保存某人的进度?

lua - Redis 链式命令

lua - 字符串中字符的最后一个索引

lua - 打印 Lua 中当前作用域可访问的所有局部变量

lua - 如何为接受并返回 2 个表的函数创建 SWIG 类型映射