Lua 基础语法|特性使用集合

来源:互联网 发布:程序员改bug 动态图 编辑:程序博客网 时间:2024/06/05 20:06

1. table.sort

下面是两个错误排序函数:

local t = {    [1] = {id=1,name="1"},    [2] = {id=2,name="2"},    [3] = {id=4,name="3"},    [4] = {id=4,name="4"},    [5] = {id=4,name="5"},}local sortFunc = function(a,b)    if a.id < b.id then        return true    elseif a.id == b.id then        return true    else        return false    endendtable.sort(t,sortFunc)

以上代码运行报错,提示排序函数无效或是 attempt to index local ‘a’ ,原因是:
当比较函数没有写的时候,table.sort默认按照lua里面的排序规则升序排序;当重写了比较函数时,比较函数重载了lua中自带的“<”比较操作符。当a=t[3],b=t[4]时,a < b,当b=t[3],a=t[4]时,b < a,两者矛盾,会出错。修正方法:当比较的值相等时总是返回false。
另一个需要注意的问题是待排序table的类型,如下:

local t = {    [1] = {id=100,name="1"},    [2] = {id=20,name="2"},    [3] = {id=4,name="3"},    [40] = {id=4,name="4"},    [5] = {id=4,name="5"},}local sortFunc = function(a,b)    if a.id < b.id then        return true    else        return false    endendtable.sort(t,sortFunc)for k,v in pairs(t) do    print("id:",v.id)endid: 20id: 100id: 4id: 4id: 4

结果基本是乱的,所以排序方法另一个需要注意的是:排序的目标table的必须是数组类型而不是链表类型。