lua表排序

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

local test_table = {2,1,3,"SORT","sort"}
table.sort(test_table , function(a , b)
        return tostring(a) > tostring(b)
    end)
for key,value in pairs(test_table) do
    print(key,value)
end  

-- 输出如下:
1    sort
2    SORT
3    3
4    2
5    1

若要进行对表进行按照 键值对key值来进行排序,只是输入的话,目测可以这样:

local test_table = {a=3,b=2,c=4,d=1}
local key_table = {}
--取出所有的键
for key,_ in pairs(test_table) do
    table.insert(key_table,key)
end
--对所有键进行排序
table.sort(key_table)
for _,key in pairs(key_table) do
    print(key,test_table[key])
end

但是这样子仅仅能够使得print输入时达到这个目的,而table本身并没有因此而改变,所以这样是不可取的; 我们可以改变泛型for的迭代因子来达到这个目的的:

function ipairs2(a)
    return iter,a,0
end

local function iter(a, i)
    i = i + 1
    local v = a[i]
    if v then
        return i, v
    else
        return nil, nil
    end
end

a = {"one","two","three"}
for k,v in ipairs2(a) do
    print(k, v)
end
--输出结果为:
--1       one
--2       two
--3       three

如此是达到我们的目的了,但是这个只能支持下表为整形的table(即是 放在table数组部分的表,hash部分却未能为力);所以需要类似这样子:

lines = {
    name = "jeff",
    {"pairsByKeys"},
    luaH_set = 10,
    luaH_get = 24,
    luaH_present = 48,
}

function pairsByKeys(t, f)
    local a = {}
    for n in pairs(t) do table.insert(a, n) end
    table.sort(a, f)
    local i = 0                 -- iterator variable
    local iter = function ()    -- iterator function
       i = i + 1
       if a[i] == nil then return nil
       else return a[i], t[a[i]]
       end
    end
    return iter
end

function sortFunc(a , b)
    if tostring(a) > tostring(b) then
        return true
    end
end

for name, line in pairsByKeys(lines , sortFunc) do
    print(name, line)
end

输出地结果如下:

name    jeff
luaH_set    10
luaH_present    48
luaH_get    24
1    table: 027EE6E8
[Finished in 0.1s]

如此这般 即可实现表按照键值对的排序了;关于泛型for的文章,可参看这边文章:Click Here

参考Bolg : Click Here

时间: 2024-10-07 05:27:01

lua表排序的相关文章

Sweet Snippet 系列之 Lua表排序

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

数据结构学习笔记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也是表的时候, 将表也拷贝一份, 否则不拷贝, 否则的方法为浅拷贝. 对

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

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

游戏资源自动转换成Lua表

关于这个问题,几年前已经做过一个工具,自动导出成一个c++的struct,然后用vector存储这些数据,然而在实践中发现在遇到多层嵌套时,这种数据表现是非常乏力的.比如掉落表会配多个掉落物,每个掉落物都有数量.概率等.那么最好是将物品ID,数量,概率设置为一个struct然后用一个vector存储,而不是用drop_id1, drop_id2, drop_num1,drop_num2来表示,类似这样的情况是很常见的.后来工作中用Lua比较多,也曾写过一个将表导出lua的工具,对上述问题的解决方

排序之表排序、基数排序及所有排序算法比较

本学习笔记部分内容来自浙江大学网易云课堂,谢谢! 1.表排序 定义一个指针数组做为表.排序的时候,数组位置上的数值不变,改变的是指针的指向. 如该图,初始数值:f d c a g b h e   开始时,比较f>d,则指针0指向d,指针1指向f.之后比较f>c,d>c,则指针0指向c,指针1指向d,指针2指向f.以此类推,最终指针0指向a的位置(即table[0]=3,A[3]那个位置) 2.基数排序 基本思想:比如十进制数字排序,先按个位数大小排,再按十位数大小排,依次.举例如下: 基

模板模式--哈希表排序

#include <iostream> #include <string> #include <map> #include <vector> #include<algorithm> using namespace std; typedef pair<string,int>PAIR; bool cmp_by_value(const PAIR& p,const PAIR &a) { return p.second<a

MYSQL数据库表排序规则不一致导致联表查询,索引不起作用问题

Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字段ishaspic:新添字段时,报错 [SQL] alter table WorkTask add ishaspic int(10) Null;[Err] 1034 - Incorrect key file for table 'WorkTask'; try to repair it 解决方案:新建

利用oracle rownum让表排序字段值连续

利用oracle rownum让表排序字段值连续 1.需求说明 表(eval_index)中有字段如下: 表字段 描述 说明 ID 主键 GROUP_ID 分组编号 SORT_NUM 排序序号 按照分值编号并排序:1.2.- 由于删除或其他操作,导致sort_num序号不连续:需要不改变原来的排序,保持其编号连续. 2.利用rownum功能实现 update eval_index a seta.sort_num = ( select b.rn from (select rownum rn ,id