将无序键从一个表复制到另一个表中的有序值

时间:2011-03-01 11:07:08

标签: 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

如何在Lua中完成?

3 个答案:

答案 0 :(得分:8)

-- 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"

答案 1 :(得分:2)

Alexander Gladysh's answer可以略微简化:

-- 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

答案 2 :(得分:1)

Lua中的表没有与之关联的订单。

当使用表作为具有从1到N的顺序整数键的数组时,可以使用循环或ipairs()按顺序迭代表。

当使用从1到N不是顺序整数的键时,无法控制顺序。为了解决这个限制,可以使用第二个表作为数组来存储第一个表中键的顺序。