如何在保留原始位置记录的同时对表格进行排序?

时间:2013-12-30 15:50:02

标签: sorting lua lua-table

我有一个整数的Lua表,我按升序排序。稍后,我的脚本需要获取最小数字的索引(即,最初在排序之前的位置),尝试一些东西,然后转到第二个最小数字的索引,尝试某些东西,等等排序列表的结尾。

我的问题是,当我对它进行排序时,我显然丢失了原始表的原始位置(或索引)。有没有办法,可能有一个包含数字和索引的嵌套表,以保留原始索引的记录,然后对整数执行排序?

让问题更清晰一点:

  

原始表:4 6 2

     

排序表:2 4 6

     

在这个排序表中,我需要知道2位于第3位   在排序之前,4位于位置1,而6位于位置   2。

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