LUA表的排序,table.sort()的使用
Posted 森明帮大于黑虎帮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LUA表的排序,table.sort()的使用相关的知识,希望对你有一定的参考价值。
最近重温下使用到表的排序,我使用table.sort通过表的value排序,使用key进行排序暂未研究。
方法原型:table.sort (table, funtion(a,b))
两个入参:
- 1.
table
-----------需要排序的table
。 - 2.
function
-------排序方法,可自定义。如果不填,则按默认排序。形式是固定的,入参a,b
为排序table
中的value1
、value2
…(这个具体不知道怎么描述)。
1.不传排序方法,采用自定义:
local t=5,4,3,2,1
print("排序前:")
for k,v in pairs(t) do
print(k,v)
end
print("排序后:")
table.sort(t)
for k,v in pairs(t) do
print(k,v)
end
可以看到,table.sort()
默认是使用table
中存贮的 value
进行从小到大的排序,有一点需要注意的是,如果table中含有number
和string
,使用默认的方法进行比较会报 number
和string
比较的错误。也有一些别的坑,使用的时候需要谨慎(默认的我用的比较少)。
2.传入自定义的排序方法:
例如传入的table是 :
local students=
names="peter",grades=10,
names="Paul", grades=7,
names="Mary",grades=8
传入的方法的格式是固定的,也就是一个:
匿名函数function(a,b)
........(你的实现)
end
匿名函数中的a,b
是传入的table的2个value
,table.sort
每次会返回两个value
传入比较函数。上例是student中的value
。
比较函数是这样的:
table.sort(students,function (a,b)
return a.grades>b.grades
end)
local students=
names="peter",grades=10,
names="Paul", grades=7,
names="Mary",grades=8
print("排序前:")
for k,v in pairs(students) do
print(k,v)
end
table.sort(students,function (a,b)
return a.grades>b.grades
end)
print("排序后:")
for k,v in pairs(students) do
print(k,v)
end
自定义的比较函数功能十分强大,但是也有一些坑。
注意:
-
1.
table.sort
并不稳定,当条件的两个元素相等时,它们在排序后的相对位置可能会改变(据说,我自己暂未出现,可能用的少) -
2.要求需要排序
table
中间元素不能有nil
,否则会报错 -
3.当比较的两个元素相等的时候,比较函数一定要返回
false
,返回true
会报错,table.sort
会根据你返回的bool
来判断两个value
是否保持原来的顺序
以上是关于LUA表的排序,table.sort()的使用的主要内容,如果未能解决你的问题,请参考以下文章