如何按值排序表并按顺序打印索引

我想使用以下格式创建一个表t

t[uniqueID] = order

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

然后我想按升序排序表,以便我可以相应地打印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

我该如何获得想要的结果?

点赞
用户1944004
用户1944004

来自《Lua 程序设计》第 19.3 节 "Sort"。

一个常见的错误是尝试对表的索引排序。在一个表中,索引形成一个集合,并没有任何顺序。

这意味着你必须将表t的键值对放入另一个表sorted中,该表需要具有连续的索引。然后,可以基于你定义的谓词对该表进行排序。此外,在迭代具有连续索引的表时,必须使用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

在 Wandbox 上运行

2018-07-11 03:24:37
用户2616735
用户2616735

pairs 不会按特定顺序迭代(无论是否已排序)。

table.sort 只能用于列表-使用键[1][2][3]等以及[#list]展开的表格。


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

  1. 制作一个ID列表
  2. 按其关联值对它们进行排序

在代码中,

local ids = {}

-- 插入顺序无关紧要,因为将进行排序
for id in pairs(t) do
    table.insert(ids, id)
end

-- 通过关联的每个值对ID列表进行排序
table.sort(ids, function(a, b)
    return t[a] < t[b]
end)

for i = 1, #ids do
    print(ids[i])
end
--> 6
--> 5
--> 7
2018-07-11 03:25:53