按其中一个表的整数值对两个表进行排序

时间:2017-12-14 22:59:56

标签: sorting printing lua lua-table

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

我有一个带整数的表和一个带字符串的表。 表是使用循环自动创建的;但是在我的测试脚本中,我手动添加了字符串表的索引,而整数表仍然是自动创建的。再次,在我的测试脚本中,我只是使用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

1 个答案:

答案 0 :(得分:0)

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

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

-- 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'不符合您预期的顺序的原因。