lua表排序

简介: 对于lua的table排序问题,一般的按照value值来排序,使用table.sort( needSortTable , func)即可(可以根据自己的需要重写func,否则会根据默认来:默认的情形之下,如果表内既有string,number类型,则会因为两个类型直接compare而出错,所以需要自...

对于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]

如此这般 即可实现表按照键值对的排序了;这样的实现方式其实与上述将table的索引存入一个temp表中,并将此temp表按func排序;只不过这里 使用闭包,将此处理放置在了一个方法内来替代pairs罢了;

关于泛型for的文章,可参看这边文章:Click Here 

参考Bolg : Click Here

倾城之链 | NICE LINKS DJI Mavic Air
目录
相关文章
|
11月前
Lua笔记表实现class
Lua笔记表实现class
38 0
|
XML Java 数据格式
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
117 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua Table表实现字典
Lua Table表实现字典
675 0
Lua Table表实现字典
|
存储 索引
lua对table排序,键值排序法
先是一个key,value的键值对,实现思路是:先遍历获取到整个table的key值,然后对key值进行升序或降序,根据排序后的key值以此取出table里面的数据进行临时存储,得到排序后的table 测试地址:https://c.
3037 0
|
算法 Java 大数据
Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较
Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较。
1238 0
lua实现深度拷贝table表
lua当变量作为函数的参数进行传递时,类似的也是boolean,string,number类型的变量进行值传递。而table,function,userdata类型的变量进行引用传递。故而当table进行赋值操作之时,table A 赋值给table B,对表B中元素进行操作自然也会对A产生影响,当然对B表本身进行处理例如B =nil或者将表B指向另一个表,则对A是没什么影响的;下面即是对lua table的深度拷贝。
1440 0