如何根据一个表的整数值对两个表进行排序

我正在尝试完善一个脚本,但似乎无法以所需的方式打印表格数据。

我有一个包含整数和一个包含字符串的表。 这些表是使用循环自动创建的;但在我的测试脚本中,我手动添加了字符串表的索引,而整数表仍然是自动创建的。同样,在我的测试脚本中,我只是使用math.random填充整数表。我有一个"if..then"跳过任何"0"条目,然后再打印。

我想要的是通过表格sc中的整数对每个打印行进行数值排序,然后打印与之关联的字符串ctable。

例如:math.random循环在表格sc中创建索引,其中sc ={"3","1","10","8","7","10"} 然后,我希望该表按降序打印,正确的字符串从ctable中获取。

>    期望打印结果:
>     g = 10
>     o = 10
>     b = 8
>     p = 7
>     c = 3
>     w = 1

在尝试了table.sort等方法后,我回到了没有排序的原始脚本(如下所示)

local ctable = {"c","w","g","b","p","o"}
local sc = {}

for i = 1, 6 do
    local mr = math.random(1,10)
    sc[i] = mr
    if sc[i] <= 0 then
        goto done
    else
        print(ctable[i] .. " = " ..sc[i])
    end
   ::done::
   i = i + 1
end
点赞
用户415823
用户415823

你需要一种将随机数与字符串值关联起来的方式。

使用两个表,在进行排序之前,关联是表的索引:

-- 索引:  1   2   3   4   5   6
local t = {'c','w','g','b','p','o'}
local n = { 3,  1,  10, 8,  7,  10}

Lua 的 table.sort 接收一个比较函数,该函数接收两个值,但您需要知道索引以便可以查看其他表以控制排序顺序。

您可以创建一个查找表,即键是值,值是索引的表:

local m = {}
for i, v in ipairs(t) do
  m[v] = i
end

-- m = {c=1, w=2, g=3, b=4, p=5, o=6}

然后,在比较函数中,您可以使用 m[a]m[b] 按值查找索引。使用索引在 n 中查找关联数字:

table.sort(t, function(a, b)
    return n[m[b]] < n[m[a]]
  end)

这仅在 t 中的值是唯一的时起作用。如果字符串可以重复,则无法使用查找表,因此您可以在一个表中存储所有内容。

local t = {{'c',3},{'w',1},{'g',10},{'b',8},{'p',7},{'o',10}}

table.sort(t, function(a, b)
    return b[2] < a[2]
  end)

for i, v in ipairs(t) do
    print(v[1]..' = '..v[2])
end

-- o = 10
-- g = 10
-- b = 8
-- p = 7
-- c = 3
-- w = 1

Lua 的 table.sort 不是稳定的;从手册中可以看出:

排序算法不稳定:由给定顺序视为相等的元素的相对位置可能会因排序而改变。

这就是为什么“g”和“o”的顺序不如您所预期的那样。

2017-12-15 05:58:54