Sorting Lua-对表格进行排序并随机化关联
我有一个包含两个值的表,一个是名称(字符串和唯一值),另一个是数字值(在本例中为hearts)。我想要的是:按红心对桌子进行排序,但在出现平局时(例如红心相等)随机搅乱项目。通过一个标准的排序函数,在出现领带的情况下,顺序总是相同的,每次排序函数工作时,我都需要它不同。 这是一个例子:Sorting Lua-对表格进行排序并随机化关联,sorting,random,lua,lua-table,Sorting,Random,Lua,Lua Table,我有一个包含两个值的表,一个是名称(字符串和唯一值),另一个是数字值(在本例中为hearts)。我想要的是:按红心对桌子进行排序,但在出现平局时(例如红心相等)随机搅乱项目。通过一个标准的排序函数,在出现领带的情况下,顺序总是相同的,每次排序函数工作时,我都需要它不同。 这是一个例子: tbl={{name=“a”,hearts=5},{name=“b”,hearts=2},{name=“c”,hearts=6},{name=“d”,hearts=2},{name=“e”,hearts=2},{
tbl={{name=“a”,hearts=5},{name=“b”,hearts=2},{name=“c”,hearts=6},{name=“d”,hearts=2},{name=“e”,hearts=2},{name=“f”,hearts=7}
sort1=函数(a,b)返回a.hearts>b.hearts结束
sort2=功能(a,b)
如果a.hearts~=b.hearts,则返回a.hearts>b.hearts
否则返回a.name>b.name结束
结束
表.排序(tbl、sort2)
本地s=“”
对于i=1,待定
s=s。。tbl[i].名称。。“(“.tbl[i].红心…””
结束
印刷品
现在,使用函数sort2
我想我已经解决了这个问题。问题是,当a.hearts==b.hearts时会发生什么?在我的代码中,它只是按领带的名字来排序,而不是我想要的。我有两个想法:
sort1
rnd
,这是一个随机数。然后在sort2
中,当a.hearts==b.hearts
按a.rnd>b.rnd
排序项目时sort2
中,当a.hearts==b.hearts
随机生成true或false并返回它。它不起作用,我知道发生这种情况是因为随机的true/false使order函数崩溃,因为可能存在不一致性奖金问题。此外,我需要修复一个项目并对其他项目进行排序。例如,假设我们希望
“c”
是第一个。创建一个单独的表,只包含要排序的项目,对表进行排序,然后添加固定的项目,这样做好吗?如果您可以随意引入新的依赖项,您可以使用来为您完成这项工作(或者查看它如何对序列进行排序,如果您不需要其余的内容):
-- example table
local tbl = {
{ name = "a", hearts = 5 },
{ name = "b", hearts = 2 },
{ name = "c", hearts = 6 },
{ name = "d", hearts = 2 },
{ name = "e", hearts = 2 },
{ name = "f", hearts = 7 },
}
-- avoid same results on subsequent requests
math.randomseed( os.time() )
---
-- Randomly sort a table
--
-- @param tbl Table to be sorted
-- @param corrections Table with your corrections
--
function rnd_sort( tbl, corrections )
local rnd = corrections or {}
table.sort( tbl,
function ( a, b)
rnd[a.name] = rnd[a.name] or math.random()
rnd[b.name] = rnd[b.name] or math.random()
return a.hearts + rnd[a.name] > b.hearts + rnd[b.name]
end )
end
---
-- Show the values of our table for debug purposes
--
function show( tbl )
local s = ""
for i = 1, #tbl do
s = s .. tbl[i].name .. "(" .. tbl[i].hearts .. ") "
end
print(s)
end
for i = 1, 10 do
rnd_sort(tbl)
show(tbl)
end
rnd_sort( tbl, {c=1000000} ) -- now "c" will be the first
show(tbl)
下面是一个用于对数字索引表进行混洗(置乱)的快速函数:
function shuffle(tbl) -- suffles numeric indices
local len, random = #tbl, math.random ;
for i = len, 2, -1 do
local j = random( 1, i );
tbl[i], tbl[j] = tbl[j], tbl[i];
end
return tbl;
end
精彩的!正如我所要求的,一个非常聪明但简单的解决方案。需要注意的是,这个排序函数只有在心是整数时才起作用。我建议添加一些内联注释来描述后面的内容logic@ValerioBozz-逻辑后面的
术语太模糊。解决方案的哪一部分对您来说很难理解?@EgorSkriptunoff我只是建议引入更多的内联注释:)@ValerioBozz-我的代码中哪些行需要额外的内联注释?AFAIU a比包含大量内联注释的代码要好。
function shuffle(tbl) -- suffles numeric indices
local len, random = #tbl, math.random ;
for i = len, 2, -1 do
local j = random( 1, i );
tbl[i], tbl[j] = tbl[j], tbl[i];
end
return tbl;
end