Sweet Snippet 系列之 Lua表排序
时间:2022-06-05
本文章向大家介绍Sweet Snippet 系列之 Lua表排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
作为Lua中实现各类数据结构的基石,表的使用想必是贯穿于整个项目的开发过程之中,其中对表内容的排序想必亦是常见的需求之一,Lua内置的Table函数库便提供了sort函数来实现这项功能,但是仅能支持表中数组部分内容的排序,而想要排序表中哈希部分的内容,简单的一个方法就是另写一个迭代器来支持:
function order_pairs(tbl)
local names_buffer = {}
for name, _ in pairs(tbl) do
table.insert(names_buffer, name)
end
table.sort(names_buffer, function(a, b) return tostring(a) < tostring(b) end)
local table_index = 0
local function iterator()
table_index = table_index + 1
local key = names_buffer[table_index]
return key, tbl[key]
end
return iterator
end
写个简单的测试:
local function print_table(tbl)
for k, v in pairs(tbl) do
print(k .. " = " .. v)
end
print "========"
end
local function print_table_order(tbl)
for k, v in order_pairs(tbl) do
print(k .. " = " .. v)
end
print "========"
end
local t = { [4] = "test", "order", b = "pairs", [2] = "another", a = "string" }
print_table(t)
print_table_order(t)
基本就是这么简单~
更新:
其实之前的实现有两个问题,使用默认的comp实现(简单的基于字符串比较),在某些情况下会得到非期望的排序结果(依赖于字符串比较的实现方式),再者也缺少扩展性,无法定制comp,更好的实现方式还是开放comp的设置,并提供默认实现:
-- order pairs implementation :
-- order is number first, then sort by tostring
local function default_sort_comp(k1, k2)
if type(k1) == "number" and type(k2) == "number" then
return k1 < k2
elseif type(k1) == "number" then
return true
elseif type(k2) == "number" then
return false
else
return tostring(k1) < tostring(k2)
end
end
function order_pairs(t, sort_comp)
-- get original keys and do sort
local keys_buffer = {}
for k, v in pairs(t) do
table.insert(keys_buffer, k)
end
table.sort(keys_buffer, sort_comp or default_sort_comp)
-- gen iterator
local current_index = 0
local function iterator()
current_index = current_index + 1
local cur_key = keys_buffer[current_index]
return cur_key, t[cur_key]
end
return iterator
end
- COGS 144. [USACO Dec07] 魅力手镯【01背包复习】
- SQL Server 使用全文索引进行页面搜索
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
- HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】
- HDU 1019 Least Common Multiple【gcd+lcm+水+多个数的lcm】
- HDU 1017 A Mathematical Curiosity【水,坑】
- 比特币项目
- HDU 1014 Uniform Generator【GCD,水】
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战05】SARSA(λ)算法实现
- 区块链应用场景:物联网和物流供应链
- HDU 1012 u Calculate e【暴力打表,水】
- Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】
- HDU 1013 Digital Roots【字符串,水】
- Gym 100952I&&2015 HIAST Collegiate Programming Contest I. Mancala【模拟】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法