LUA表的排序,table.sort()的使用

最近重温下使用到表的排序,我使用table.sort通过表的value排序,使用key进行排序暂未研究。

方法原型:table.sort (table, funtion(a,b))

两个入参:

  • 1.table-----------需要排序的table
  • 2.function-------排序方法,可自定义。如果不填,则按默认排序。形式是固定的,入参a,b为排序table中的value1value2…(这个具体不知道怎么描述)。

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中含有numberstring,使用默认的方法进行比较会报 numberstring比较的错误。也有一些别的坑,使用的时候需要谨慎(默认的我用的比较少)。

2.传入自定义的排序方法:
例如传入的table是 :

local students={
   {names="peter",grades=10},
   {names="Paul", grades=7},
   {names="Mary",grades=8}
}

传入的方法的格式是固定的,也就是一个:

匿名函数function(a,b)

               ........(你的实现)

              end

匿名函数中的a,b是传入的table的2个valuetable.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是否保持原来的顺序

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森明帮大于黑虎帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值