如何在记录原始仓位的同时对表格进行排序



我有一个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

最新更新