Lua 按不同字段对表格进行两次排序

Lua sorting a table twice by different fields

提问人:AeroMaxx 提问时间:11/6/2023 最后编辑:AeroMaxx 更新时间:11/6/2023 访问量:58

问:

下面是我想要排序的示例表结构。

Data = {
    ["C1_RN1::F1"] = {
        ["class"] = "Hunter",
        ["name"] = "C1",
        ["faction"] = "Faction",
        ["race"] = "Human",
        ["realm"] = "RN1",
    },
    ["C2_RN1::F1"] = {
        ["class"] = "Priest",
        ["name"] = "C2",
        ["faction"] = "Faction",
        ["race"] = "Undead",
        ["realm"] = "RN1",
    },
    ["C3_RN1::F1"] = {
        ["class"] = "Hunter",
        ["name"] = "C3",
        ["faction"] = "Faction",
        ["race"] = "Human",
        ["realm"] = "RN1",
    }
}

因此,例如,我想按字母顺序排序,并按字母顺序对所有“人类”种族字符进行排序,并按独立于另一个“种族”的字母顺序对任何其他“种族”进行排序。raceclass

我知道如何通过将所有字符名称转储到具有与表相同的键的第二个表中来仅按 1 排序,然后使用 和 a 将数据与小于运算符(例如 .datadatatable.sortdata[a].race < data[b].race

这是我尝试用于基本排序的函数,但这在使用 Lua 5.1 不起作用,我收到一个错误,说应该在 .=<

local function SortThis()
    local temp = {}

    for c in pairs(Data) do
        table.insert(temp, c);
    end

    table.sort(temp, function(a, b)
        return Data[a].race < RestXP_Data[b].race;
    end)
end
多维阵列 Lua LUA 表 进行排序

评论

2赞 Oka 11/6/2023
目前没有什么可以排序的,因为您有关联数组类型的表(任意排序的键和值)。你是说你想转换为一个类似数组的表(一个带有数字索引的表),它按多个条件排序?Data
0赞 AeroMaxx 11/6/2023
@Oka我会将我的函数添加到问题中,尽管该函数不起作用,但它会给出 lua 错误,但我也会解释这一点。

答:

3赞 Oka 11/6/2023 #1

目前没有什么可排序的,因为您有关联数组类型的表,这些表将始终具有任意排序的键和值。您只能对类似数组的表(带有数字索引的表)进行排序。

在比较函数中,只需检查主要比较是否相等,在这种情况下,您继续进行二次比较(然后是三级比较等)。如果键比较不相等,则返回该键的相应结果(即 或 )。<>

请注意,table.sort 不稳定

local data = {
    ["C1_RN1::F1"] = {
        ["class"] = "Warrior",
        ["name"] = "C1",
        ["faction"] = "Faction",
        ["race"] = "Human",
        ["realm"] = "RN1",
    },
    ["C2_RN1::F1"] = {
        ["class"] = "Priest",
        ["name"] = "C2",
        ["faction"] = "Faction",
        ["race"] = "Undead",
        ["realm"] = "RN1",
    },
    ["C3_RN1::F1"] = {
        ["class"] = "Hunter",
        ["name"] = "C3",
        ["faction"] = "Faction",
        ["race"] = "Human",
        ["realm"] = "RN1",
    }
}

local collapsed = {}

for key, value in pairs(data) do
    table.insert(collapsed, value)
end

table.sort(collapsed, function (a, b)
    if a.race == b.race then
        return a.class < b.class
    end

    return a.race < b.race
end)

for _, character in ipairs(collapsed) do
    print(character.name, character.race, character.class)
end
C3  Human   Hunter
C1  Human   Warrior
C2  Undead  Priest

如果您有很多键要比较,则可以遍历它们。

table.sort(collapsed, function (a, b)
    local order = { 'race', 'class', 'realm' }

    for _, key in ipairs(order) do
        if a[key] ~= b[key] then
            return a[key] < b[key]
        end
    end
end)

评论

0赞 AeroMaxx 11/6/2023
我仅限于使用 Lua 5.1,因为代码是游戏的,他们目前使用它。至于与我正在做的事情相似的代码,希望我没有如果,但是其他一切都是一样的。我会试一试。table.sort(collapsed