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)

基本就是这么简单~

时间: 2024-10-25 18:23:08

Sweet Snippet 系列之 Lua表排序的相关文章

Sweet Snippet系列 之 TCP数据接收

Sweet Snippet系列 之 TCP数据接收 一.引子 虽说仍然是Sweet Snippet,不过本篇并没有代码,纯粹是自己觉得有点趣味,就索性一记了~ 二. 问题 接触过网络编程的朋友大概都应知道TCP,作为一种"流"式协议,TCP的粘包问题一直都是程序处理的要点,而这次的问题就是,如果发送n字节的TCP数据,对端接收时会出现多少种接收情况? 三. 解法 我们先从具体的一个实例来简单算一算吧~就假设我们发送了3个字节的TCP数据: 由于TCP如果接收成功至少可以接收一个字节,所

lua表排序

对于lua的table排序问题,一般的按照value值来排序,使用table.sort( needSortTable , func)即可(可以根据自己的需要重写func,否则会根据默认来:默认的情形之下,如果表内既有string,number类型,则会因为两个类型直接compare而出错,所以需要自己写func来转换一下:也可根据自己的需要在此func中 添加相应的逻辑来达到你的 排序要求): local test_table = {2,1,3,"SORT","sort&qu

数据结构学习笔记06排序 (快速排序、表排序)

1.快速排序 不稳定 分而治之 找主元pivot,小于主元划分为一个子集,大于主元的划分为一个子集 然后进行递归 最好情况:每次主元正好中分,T(N) = O( NlogN ) 选主元 的方法有很多,这里用 取头.中.尾的中位数. 直接选A[0]为pivot,时间复杂度T ( N ) = O( N ) + T ( N–1 ) = O( N ) + O ( N–1 ) + T( N–2 ) = = O( N ) + O ( N–1 ) + …+ O( 1 ) = O( N^2 ) 随机取pivot

LUA表克隆方法归纳

lua表克隆 将lua一个表, 克隆出一份为一个独立的另外一个表. 对于一个module, 如果在require之后,获得的表对象, 不能直接修改, 例如lua缓存此表, 但是多次逻辑执行, 都使用的是原始module, 这种情况就需要使用clone. clone实例, 例如将 {1} 克隆出一份 {1}, 使用 tostring 打印两个表,可以看到地址不同. 支持浅.深拷贝方法 深拷贝, 即当遇到表的key或者value也是表的时候, 将表也拷贝一份, 否则不拷贝, 否则的方法为浅拷贝. 对

7Python全栈之路系列之Django表单

Python全栈之路系列之Django表单 从Request对象中获取数据 HttpRequest对象包含当前请求URL的一些信息: 熟悉/方法 描述 例如 request.path 除域名以外的请求路径 /hello/ request.get_host() 访问的域名 127.0.0.1:8000" or www.example.com request.get_full_path() 请求路径,可能包含查询字符串 /hello/?print=true request.is_secure() 是

深入理解表单脚本系列第一篇——表单对象

× 目录 [1]表单属性 [2]表单事件 [3]表单方法 前面的话 javascript最初的一个应用就是分担服务器处理表单的责任,打破处处依赖服务器的局面.尽管目前的web和javascript已经有了长足的发展,但web表单的变化并不明显.由于web表单没有为许多常见任务提供现成的解决方法,很多开发人员不仅会在验证表单时使用javascript,而且还增强了一些标准表单控件的默认行为.本文是表单脚本系列第一篇——表单对象 表单属性 在HTML中,表单是由form元素来表示的,而在javasc

[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键 http://imysql.com/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml 我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子节点(leaf pages of the tree):

数据结构--排序(上)--表排序

表排序 表排序排序的是一个元素很大的.移动元素的时间很长,所以移动指针. 间接排序 物理排序 N个数字的排列由若干个独立的环组成. 如何判断一个环的结束? 正确答案:每访问一个空位i后,就令table[i]=i.当发现table[i]== i  时,环就结束了. 物理排序过程的最好情况是 :顺序都是一样的,什么都不用做. 物理排序过程的最坏情况是 : 有N/2个环,每个环包含2个元素

【T-SQL系列】新的排序函数

原文:[T-SQL系列]新的排序函数 如:ROW_NUMBER.RANK.DENSE_RANK三个分析函数都是按照col1分组内从1开始排序 ROW_NUMBER() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页 DENSE_RANK() 是连续排序,两个第二名仍然跟着第三名RANK() 是跳跃拍学,两个第二名下来就是第四名 示例: DECLARE @t1 TABLE ( Sequence INT , Name VARCHAR(20) , Score INT ) IN