如何交换 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.
一个有趣的解决方案,但受到主要问题的困扰:
- 它无法处理
table.insert
和 table.remove
调用导致的索引偏移,导致后来的 table.insert
和 table.remove
调用对错误的索引进行操作(这虽然可以修复)
- 需要线性时间(由于上述索引偏移),对于这样的基本操作来说是不可接受的table。
- 太复杂了。
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)
),则必须分配元 table。 local metatable = {__index = {Swap = Swap}}; setmetatable(Table, metatable)
将为此工作。
- 为什么
Swap
函数 return Table
?这仅对某些语法糖有用(链接,f.E。在您的示例中使用 pairs
),并且在区分语句和表达式的语言中可能出乎意料。
- 同样,我可能不会为此使用函数(特别是考虑到
require
函数所需的代码或全局命名空间污染,否则您需要使其可用),而是 只需使用作业 Table[i], Table[j] = Table[j], Table[i]
.
- 您的命名约定(我在本 post 中坚持使用)有点令人不快;
UpperCamelCase
通常用于 class 和 Lua 中的元table 名称,而不是函数和 (table) 变量。
如何交换 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.
一个有趣的解决方案,但受到主要问题的困扰:
- 它无法处理
table.insert
和table.remove
调用导致的索引偏移,导致后来的table.insert
和table.remove
调用对错误的索引进行操作(这虽然可以修复) - 需要线性时间(由于上述索引偏移),对于这样的基本操作来说是不可接受的table。
- 太复杂了。
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)
),则必须分配元 table。local metatable = {__index = {Swap = Swap}}; setmetatable(Table, metatable)
将为此工作。 - 为什么
Swap
函数 returnTable
?这仅对某些语法糖有用(链接,f.E。在您的示例中使用pairs
),并且在区分语句和表达式的语言中可能出乎意料。 - 同样,我可能不会为此使用函数(特别是考虑到
require
函数所需的代码或全局命名空间污染,否则您需要使其可用),而是 只需使用作业Table[i], Table[j] = Table[j], Table[i]
. - 您的命名约定(我在本 post 中坚持使用)有点令人不快;
UpperCamelCase
通常用于 class 和 Lua 中的元table 名称,而不是函数和 (table) 变量。