Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Lua-对表格进行排序并随机化关联_Sorting_Random_Lua_Lua Table - Fatal编程技术网

Sorting Lua-对表格进行排序并随机化关联

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},{

我有一个包含两个值的表,一个是名称(字符串和唯一值),另一个是数字值(在本例中为hearts)。我想要的是:按红心对桌子进行排序,但在出现平局时(例如红心相等)随机搅乱项目。通过一个标准的排序函数,在出现领带的情况下,顺序总是相同的,每次排序函数工作时,我都需要它不同。 这是一个例子:

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函数崩溃,因为可能存在不一致性
  • 我不喜欢1(因为我想做排序函数中的所有事情)和2(因为它需要添加一个值),我想做一些像3这样的事情,但是工作正常。问题是:有没有一种简单的方法可以做到这一点,什么是最佳的方法?(也许,方法1或2是最佳的,我不明白)


    奖金问题。此外,我需要修复一个项目并对其他项目进行排序。例如,假设我们希望
    “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