您如何交换表中的值并将其交换为不同的值?例如:
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.
一个有趣的解决方案,但受到主要问题的困扰:
- 它无法处理
table.insert
和table.remove
调用导致的索引移位,导致以后的table.insert
和table.remove
调用对错误的索引进行操作(虽然这可以修复) - 它需要线性时间(由于上述索引偏移),这对于这样的基本操作来说是 Not Acceptable 。
- 它过于复杂。
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
函数变得多余,因为它几乎不比每次都写下作业更短或更简洁)
注意事项:
- 如果您希望能够以 OOP 方式使用
Swap
函数 (Table:Swap(i, j)
),您必须分配一个元表。本地元表 = {__index = {Swap = Swap}}; setmetatable(Table, metatable)
将为此工作。 - 为什么
Swap
函数返回Table
?这仅对某些语法糖有用(链接,f.E. 与pairs
在您的示例中)并且在区分语句和表达式的语言中可能是意想不到的。 - 同样,我可能不会为此使用函数(特别是考虑到
要求
函数所需的代码或全局命名空间污染,否则您需要使其可用),而是只需使用赋值Table[i], Table[j] = Table[j], Table[i]
。 - 您的命名约定(我在这篇文章中坚持使用)有点令人不快;
UpperCamelCase
通常用于 Lua 中的类和元表名称,而不是函数和(表)变量。
关于lua - 你如何交换 lua 表中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72068474/