Lua中如何反转table元素 是否存在类table.sort的反向排序方法
Lua Table 顺序操作相关解答
实现table元素顺序反转的方法
Lua标准库没有内置table反转函数,仅*序列型table(索引从1开始、键为连续正整数的数组结构table)*存在确定的存储顺序,含非连续整数索引、字符串等哈希键的table无固定遍历顺序,做顺序反转没有实际意义。
针对序列型table,最常用的是原地反转方案,空间复杂度O(1),执行效率高:
function reverse_inplace(tbl) local len = #tbl -- 遍历到表长度一半位置即可,对称位置交换元素 for i = 1, math.floor(len / 2) do tbl[i], tbl[len - i + 1] = tbl[len - i + 1], tbl[i] end return tbl end -- 调用示例 local arr = {1,2,3,4,5} reverse_inplace(arr) -- 执行后arr的值为{5,4,3,2,1}
如果不想修改原始table,可以用拷贝反转的方案,返回新的反转后表:
function reverse_copy(tbl) local res = {} local len = #tbl for i = 1, len do res[i] = tbl[len - i + 1] end return res end
反向排序的实现方法
Lua标准库没有提供独立的反向排序内置函数,但table.sort本身支持传入自定义比较函数,直接调整比较逻辑就能实现反向排序,不需要额外的专用方法。
table.sort默认的比较逻辑是a < b,最终输出升序排列结果,只要把比较逻辑改成a > b,就能得到降序(反向)排序的结果:
local arr = {3,1,4,1,5,9,2,6} -- 默认升序排序 table.sort(arr) -- 排序结果:{1,1,2,3,4,5,6,9} -- 传入自定义比较函数实现反向降序排序 table.sort(arr, function(a, b) return a > b end) -- 排序结果:{9,6,5,4,3,2,1,1}
如果目标table已经完成了升序排序,直接调用前面的反转函数即可得到反向排序结果,比重新执行一遍排序的性能更好,尤其在表元素数量较多时差距明显。
内容的提问来源于stack exchange,提问作者deh3
相关产品推荐
相关产品推荐

