使用比较器调用 table.sort
使用自定义比较器函数和稳定排序策略对表进行排序。
使用比较器调用 table.sort 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
什么是 table.sort?
table.sort 使用比较函数对表进行原地排序。如果不提供比较函数,则使用 < 运算符。
默认升序排序
对数字或字符串表调用 table.sort(t),即可按升序排序。
local nums = {5, 2, 8, 1, 9}
table.sort(nums)
for _, v in ipairs(nums) do print(v) end自定义比较函数
将函数 function(a, b) return a < b end 作为第二个参数传入。
local words = {"banana", "apple", "cherry"}
table.sort(words, function(a, b) return a < b end)
print(table.concat(words, ", "))降序排序
反转比较关系即可按降序排序。
local nums = {3, 1, 4, 1, 5, 9}
table.sort(nums, function(a, b) return a > b end)
print(table.concat(nums, ", "))按字段对表排序
根据指定字段键对记录数组进行排序。
local people = {
{name="Charlie", age=30},
{name="Alice", age=25},
{name="Bob", age=28}
}
table.sort(people, function(a, b) return a.age < b.age end)
for _, p in ipairs(people) do print(p.name, p.age) end多键排序
先按主键排序;如果主键相同,再按次键排序。
table.sort(people, function(a, b)
if a.age ~= b.age then return a.age < b.age end
return a.name < b.name
end)稳定性说明
Lua 的 table.sort不保证稳定。相等元素可能以任意顺序出现。请使用索引作为平局决胜依据,以获得确定性结果。
不区分大小写地排序字符串
在比较函数中使用 string.lower 进行规范化。
table.sort(words, function(a, b)
return a:lower() < b:lower()
end)使用键提取器排序
使用施瓦茨变换方法缓存提取出的键,避免排序过程中重复计算。
local function sortBy(t, keyFn)
local keyed = {}
for i, v in ipairs(t) do keyed[i] = {val=v, key=keyFn(v)} end
table.sort(keyed, function(a, b) return a.key < b.key end)
for i, item in ipairs(keyed) do t[i] = item.val end
end对大型表排序
对于非常大的表,请考虑使用施瓦茨变换:将每个元素与其排序键配对,排序后再提取元素。这样可以避免在每次比较时重新计算键。
原地排序与复制排序
table.sort 会修改原表。若要对副本排序,请先使用 table.move 或通过遍历创建副本,然后对副本排序。
比较函数问题
哪个比较函数会按升序排列数字?
回顾:table.sort
table.sort 会原地排序,接受可选的比较函数,但不保证稳定;对于复杂的排序要求,通常会结合基于字段或多键的策略使用。
常见问题解答
「使用比较器调用 table.sort」课时是免费的吗?
是的 — 「使用比较器调用 table.sort」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「使用比较器调用 table.sort」这节课中我会学到什么?
使用自定义比较器函数和稳定排序策略对表进行排序。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用比较器调用 table.sort」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用比较器调用 table.sort
- table.concat 和 table.move
- 深拷贝和浅拷贝
- 转换表:map、filter、reduce