如何按值对 table 进行排序,然后按顺序打印索引

How to sort table by value and then print index in order

我想使用以下格式创建 table t

t[uniqueID] = order

uniqueID 将是唯一的,但 order 每次都可以相同或不同。

然后我想按升序对 table 进行排序,以便我可以相应地打印 uniqueID

我的代码:

t = {}

function compare(a, b)
    return a[2] < b[2]
end

function printid()
    for k, v in pairs(t) do
        print(k)
    end
end

function main()
    t[5] = 47
    t[6] = 45
    t[7] = 49
    table.sort(t, compare)
    printid()
end

我得到的结果:

5
6
7

我期望的结果:

6
5
7

怎样才能得到我想要的结果?

来自“在 Lua 中编程”部分 19.3 “Sort”

A common mistake is to try to order the indices of a table. In a table, the indices form a set, and have no order whatsoever.

这意味着您必须将 table t 对放入另一个 table sorted 中,然后具有连续的索引。然后可以根据您定义的谓词对 table 进行排序。此外,在迭代连续索引的 table 时必须使用 ipairs,因为在 pairs 中未指定顺序。

local t = {}

t[5] = 47
t[6] = 45
t[7] = 49

local sorted = {}
for k, v in pairs(t) do
    table.insert(sorted,{k,v})
end

table.sort(sorted, function(a,b) return a[2] < b[2] end)

for _, v in ipairs(sorted) do
    print(v[1],v[2])
end

Live on Wandbox

pairs doesn't iterate in any particular order(不管是否排序)

table.sort 仅适用于 lists -- 使用键 [1][2][3] 的表。 .., [#list].


您需要一个按排序顺序排列的 ID 列表。这意味着

  1. 列出 ID
  2. 按关联值对它们进行排序

在代码中,

local ids = {}

-- Order of insertion doesn't matter here since we will sort
for id in pairs(t) do
    table.insert(ids, id)
end

-- Sort the list of IDs by the values associated with each
table.sort(ids, function(a, b)
    return t[a] < t[b]
end)

for i = 1, #ids do
    print(ids[i])
end
--> 6
--> 5
--> 7