Sorting 将无序键从一个表复制到另一个表中的有序值
我有一个将字符串映射到数字的表,如下所示:Sorting 将无序键从一个表复制到另一个表中的有序值,sorting,lua,Sorting,Lua,我有一个将字符串映射到数字的表,如下所示: t['a']=10 t['b']=2 t['c']=4 t['d']=11 T[1] = 'd' -- 11 T[2] = 'a' -- 10 T[3] = 'c' -- 4 T[4] = 'b' -- 2 由此,我想创建一个类似数组的表,其值是第一个表中的键,按它们在第一个表中的(降序)值排序,如下所示: t['a']=10 t['b']=2 t['c']=4 t['d']=11 T[1] = 'd' -- 11 T[2] = 'a' -- 1
t['a']=10
t['b']=2
t['c']=4
t['d']=11
T[1] = 'd' -- 11
T[2] = 'a' -- 10
T[3] = 'c' -- 4
T[4] = 'b' -- 2
由此,我想创建一个类似数组的表,其值是第一个表中的键,按它们在第一个表中的(降序)值排序,如下所示:
t['a']=10
t['b']=2
t['c']=4
t['d']=11
T[1] = 'd' -- 11
T[2] = 'a' -- 10
T[3] = 'c' -- 4
T[4] = 'b' -- 2
如何在卢阿做到这一点
-- Your table
local t = { }
t["a"] = 10
t["b"] = 2
t["c"] = 4
t["d"] = 11
local T = { } -- Result goes here
-- Store both key and value as pairs
for k, v in pairs(t) do
T[#T + 1] = { k = k, v = v }
end
-- Sort by value
table.sort(T, function(lhs, rhs) return lhs.v > rhs.v end)
-- Leave only keys, drop values
for i = 1, #T do
T[i] = T[i].k
end
-- Print the result
for i = 1, #T do
print("T["..i.."] = " .. ("%q"):format(T[i]))
end
它打印
T[1] = "d"
T[2] = "a"
T[3] = "c"
T[4] = "b"
T[1]=“d”
T[2]=“a”
T[3]=“c”
T[4]=“b”
Lua中的表没有与之关联的顺序 将表用作具有从1到N的顺序整数键的数组时,可以使用循环或
ipairs()
按顺序迭代该表
当使用不是从1到N的顺序整数的键时,无法控制顺序。为了克服这个限制,可以使用第二个表作为数组来存储第一个表中键的顺序。可以稍微简化:
-- Your table
local t = { }
t["a"] = 10
t["b"] = 2
t["c"] = 4
t["d"] = 11
local T = { } -- Result goes here
-- Store keys (in arbitrary order) in the output table
for k, _ in pairs(t) do
T[#T + 1] = k
end
-- Sort by value
table.sort(T, function(lhs, rhs) return t[lhs] > t[rhs] end)
-- Print the result
for i = 1, #T do
print("T["..i.."] = " .. ("%q"):format(T[i]))
end
我认为您需要在
“a”
、“b”
、“c”
和“d”
周围加引号,除非它们是变量名。是的,您是对的,键是字符串。可能是重复的,对。但是,也许用table.insert(T,v)替换T[#T+1]=v会更像“按书编码”的风格,即使它有更多的字符。#T+1
是按书编码的<代码>表格。插入,从思想上讲,是用于堆栈之类的-当您必须将其与表格配对时。删除
(或用于在表格的其他位置插入,而不是在课程结束时插入)。