我正在尝试对脚本进行最后润色,但我似乎无法以我想要的方式打印表格数据。
我有一个带整数的表和一个带字符串的表。 表是使用循环自动创建的;但是在我的测试脚本中,我手动添加了字符串表的索引,而整数表仍然是自动创建的。再次,在我的测试脚本中,我只是使用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
答案 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'
不符合您预期的顺序的原因。