我有一个整数的Lua表,我按升序排序。稍后,我的脚本需要获取最小数字的索引(即,最初在排序之前的位置),尝试一些东西,然后转到第二个最小数字的索引,尝试某些东西,等等排序列表的结尾。
我的问题是,当我对它进行排序时,我显然丢失了原始表的原始位置(或索引)。有没有办法,可能有一个包含数字和索引的嵌套表,以保留原始索引的记录,然后对整数执行排序?
让问题更清晰一点:
原始表:4 6 2
排序表:2 4 6
在这个排序表中,我需要知道2位于第3位 在排序之前,4位于位置1,而6位于位置 2。
答案 0 :(得分:4)
类似下面的内容(在答案框中编写的未经测试的代码)应该无论唯一性如何都可以工作(尽管lua表排序不稳定,因此无法保证在重要的情况下首先排序哪些相等的元素):< / p>
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
答案 1 :(得分:3)
如果保证所有值都是唯一的,那么这很简单。
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 3 4 1 6 2