前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sweet Snippet 系列之 Lua表排序

Sweet Snippet 系列之 Lua表排序

作者头像
用户2615200
发布2018-08-02 16:56:46
4160
发布2018-08-02 16:56:46
举报
文章被收录于专栏:tkokof 的技术,小趣及杂念

  作为Lua中实现各类数据结构的基石,表的使用想必是贯穿于整个项目的开发过程之中,其中对表内容的排序想必亦是常见的需求之一,Lua内置的Table函数库便提供了sort函数来实现这项功能,但是仅能支持表中数组部分内容的排序,而想要排序表中哈希部分的内容,简单的一个方法就是另写一个迭代器来支持:

代码语言:javascript
复制
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

写个简单的测试:

代码语言:javascript
复制
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的设置,并提供默认实现: 

代码语言:javascript
复制
-- 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年03月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档