【问题标题】:How do I sort a table while keeping a record of the original positions?如何在保留原始位置记录的同时对表格进行排序?
【发布时间】:2013-12-30 15:50:01
【问题描述】:

我有一个 Lua 整数表,我按升序排序。稍后,我的脚本需要取最小数字的索引(即排序之前它原来的位置),尝试一些东西,然后移动到第二小数字的索引,尝试一些东西,等等,直到排序列表的末尾。

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

为了让问题更清楚一点:

原表:4 6 2

排序表:2 4 6

在这个排序表中,我需要知道 2 在位置 3 在排序之前,那个 4 在位置 1,那个 6 在位置 2.

【问题讨论】:

  • 是的,嵌套表可以为您做到这一点,也可以保留第二个表(假设您的值保证唯一)。
  • 谢谢!是的,我的价值观保证是独一无二的。你知道如何有效地实现这一点吗?我对 lua 中的嵌套不熟悉,并且对语法有困难...

标签: sorting lua lua-table


【解决方案1】:

无论唯一性如何,以下内容(在答案框中编写的未经测试的代码)都应该可以工作(尽管 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

【讨论】:

  • 这看起来是一个非常好的答案!但是,在测试时,我的解释器在“table.sort(sorttab, function(a, b) a.value
  • 我在 comp 函数中错过了 return。试试看。
【解决方案2】:

如果您的所有值都保证是唯一的,那么这很简单。

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

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2011-11-04
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2021-10-15
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多