我有一个Lua整数表,我按升序排序。稍后,我的脚本需要获取最小数字的索引(即它在排序之前最初所在的位置),尝试一些东西,然后移动到第二个最小数字的索引,尝试一些东西,等等,直到排序列表的末尾。
我的问题是,当我对它进行排序时,我显然丢失了原始表的原始位置(或索引)。有没有办法,也许有一个同时包含数字和索引的嵌套表,来记录原始索引,然后对整数执行排序?
为了使问题更清楚一点:
原表:4 6 2
排序表:2 4 6
在这个排序表中,我需要知道 2 在位置 3 在排序之前,4 在位置 1,6 在位置 阿拉伯数字。
无论唯一性如何,如下所示(在答案框中编写的未经测试的代码)都应该有效(尽管lua表排序不稳定,因此您无法保证在重要的情况下首先对哪些相等元素进行排序):
local origtab = {4, 6, 2}
local sorttab = {}
for i,v in ipairs(origtab) do
sorttab[i] = {index = i, value = v}
end
table.sort(sorttab, function(a, b) return a.value < b.value end)
for i,t in ipairs(sorttab) do
-- t.index is original index
-- t.value is value
end
如果保证所有值都是唯一的,那么这很简单。
local function remember_sort(t)
local map = {}
for i=1, #t do map[t[i]] = i end
table.sort(t)
return map -- map of values to old indices
end
local t = {4, 6, 2}
local r = remember_sort(t)
for k, v in pairs(r) do print(k, v) end
2 34 16 2