Lua中高级表格排序

3
我将尝试对一张高级表格进行排序,但是并没有成功。以下是我的表格结构:

这是我的表格结构:

{
    ["12345"] = {12345, "Something", {"Stuff"}},
    ["523544"] = {523544, "Something", {"Stuff"}},
    ["6744"] = {6744, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
    ["724572"] = {724572, "Something", {"Stuff"}},
    ["54"] = {54, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
    ["12345"] = {12345, "Something", {"Stuff"}},
    ["44"] = {44, "Something", {"Stuff"}},
}

我希望您能将其从最大到最小排序,如下所示:
{
    ["724572"] = {724572, "Something", {"Stuff"}},
    ["523544"] = {523544, "Something", {"Stuff"}},
    ["12345"] = {12345, "Something", {"Stuff"}},
    ["12345"] = {12345, "Something", {"Stuff"}},
    ["6744"] = {6744, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
    ["54"] = {54, "Something", {"Stuff"}},
    ["44"] = {44, "Something", {"Stuff"}},
}

我在这里遇到了几个问题。

  1. 它无法保存相等的2个数字
  2. 我似乎无法将其正确地从大到小排序

至于为什么索引是字符串,如果我执行 table[623258195] = "Example",表将创建623258195个索引,导致我的程序崩溃。

至于为什么值是表格,它存储其他重要信息,第2个和第3个值在表格中是什么,第1个是索引的数字形式。

我希望我说得清楚,如果这被认为是重复的问题,我很抱歉,在过去的一个小时搜索中,我没有找到任何有助于我解决问题的内容。


3
如果没有使用整数键,您将无法对表进行排序。 您可以创建第二个表格,按顺序排列,具有整数键,并且该表中的值等于未排序表中相应键的值。稍后我会发布一个示例。 - Advert
此外 - 使用 table[largenum] 不会(不应该?)创建索引直到 largenum - Advert
我再次测试了 table[largenum],看起来你是正确的,尽管我记得一段时间前遇到过这个问题。 - Jonny
然而,我仍然无法使用索引来保存值,因为我需要能够保存多个相同的数字。在此期间,我将尝试进行实验。 - Jonny
如果我执行table[623258195] = "Example",那么该表将创建623258195个索引。哪种Lua实现会以这种方式运行?标准实现不会。 - Tom Blodget
2个回答

1
  1. 你需要修改数据结构,以支持具有相同id/key的多个值:

    {
        [12345] = {
            {12345, "foo", {"bar"}}, -- 你可能想要对这些进行排序。
            {12345, "baz", {"qux"}}
        },
        [123] = {
            {123, "foo", {"bar"}}
        }
    }
    
  2. 你可以使用table.sort(tbl, f),以及一个索引表:

    local unsorted = {} -- 在此表内部的数据,格式与您的格式相同。
    local index = {} -- 将包含已排序键的表(然后您循环遍历该表,获取未排序[k])
    for k in pairs(unsorted) do
        index[#index+1] = k -- 填充要排序的键。
    end
    table.sort(index, function(a, b) 
     return b < a -- 按最高到最低的顺序排序,而不是按最低到最高的顺序(默认值)
    end)
    
这是完整的代码示例和结果。http://ideone.com/thE1zP

如果需要更多解释,请告诉我。对于多个键,我忘了提到,您只需要分支出:tbl [1234] = {[1] = {1234,“数据”},[2] = {1234,“其他数据”}}} - Advert

0

在哈希中,你无法对键进行“排序”,因为它们不像表中的整数序列那样具有“顺序”。

你可以改变数据结构,将哈希转换为表格,但更简单的方法可能是创建一个只包含哈希键的单独表格,并对其值进行排序;当你需要按特定顺序获取哈希中的元素时,只需遍历该表格中(已排序的)元素,然后从哈希中检索元素。

无论哪种情况,你都无法存储多个值于同一键中,就像你试图做的那样:

{
...
    ["146"] = {146, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
    ["146"] = {146, "Something", {"Stuff"}},
...
}

你需要把它们存储在一个表格中(并使用"146"键引用该表格),或者重新考虑为什么需要使用相同的键值来具有不同的元素键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接