提问人:AeroMaxx 提问时间:11/6/2023 最后编辑:AeroMaxx 更新时间:11/6/2023 访问量:58
Lua 按不同字段对表格进行两次排序
Lua sorting a table twice by different fields
问:
下面是我想要排序的示例表结构。
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",
}
}
因此,例如,我想按字母顺序排序,并按字母顺序对所有“人类”种族字符进行排序,并按独立于另一个“种族”的字母顺序对任何其他“种族”进行排序。race
class
我知道如何通过将所有字符名称转储到具有与表相同的键的第二个表中来仅按 1 排序,然后使用 和 a 将数据与小于运算符(例如 .data
data
table.sort
data[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
答:
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
评论
Data