【问题标题】:Sort two tables by the integer values of one of them按其中一个的整数值对两个表进行排序
【发布时间】:2018-05-29 03:18:36
【问题描述】:

我正在尝试对脚本进行最后润色,但我似乎无法以我想要的方式打印表格数据。

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

我想要的是通过表 sc 中的整数对每个打印行进行数字排序,然后用它打印表 ctable 中的相关字符串。

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

>    Desired print results: 
>     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

【问题讨论】:

    标签: sorting printing lua lua-table


    【解决方案1】:

    您需要一种将随机数与字符串值相关联的方法。

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

    -- index:   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 不稳定;来自Manual

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

    这就是为什么'g''o' 的顺序不符合您的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      相关资源
      最近更新 更多