博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sweet Snippet 系列之 Lua表排序
阅读量:4223 次
发布时间:2019-05-26

本文共 1899 字,大约阅读时间需要 6 分钟。



  作为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 iteratorend

 

  写个简单的测试:

local function print_table(tbl)    for k, v in pairs(tbl) do        print(k .. " = " .. v)    end    print "========"endlocal function print_table_order(tbl)    for k, v in order_pairs(tbl) do        print(k .. " = " .. v)    end    print "========"endlocal 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 tostringlocal 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)    endendfunction 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 iteratorend

转载地址:http://mizqi.baihongyu.com/

你可能感兴趣的文章
Python 多线程技巧 用threading.Event代替time.sleep()
查看>>
工具】Cmake与gcc的关系
查看>>
struct中长度为0的数组用途与原理
查看>>
svm笔记
查看>>
C++ 继承&多态
查看>>
高人对libsvm的经典总结(全面至极)
查看>>
Linux下c语言多线程编程
查看>>
Docker拉取镜像失败报错Error response from daemon: Get https://registry-1.docker.io解决办法
查看>>
IO操作的工具类总结
查看>>
Java中如何遍历Map对象的4种方法
查看>>
图片延时加载例子详解
查看>>
js获取url参数值的两种方式详解
查看>>
MyEclipse设置默认注释的格式
查看>>
同一服务器部署多个tomcat时的端口号修改详情
查看>>
常用正则表达式集锦
查看>>
Spring定时器的时间表达式
查看>>
主键和唯一索引的区别
查看>>
linux下使用yum安装gcc详解
查看>>
aclocal安装依赖的库
查看>>
ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)解决方案
查看>>