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


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

    方法原型: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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    可以看到,table.sort()默认是使用table中存贮的 value进行从小到大的排序,有一点需要注意的是,如果table中含有numberstring,使用默认的方法进行比较会报 numberstring比较的错误。也有一些别的坑,使用的时候需要谨慎(默认的我用的比较少)。

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

    local students={
       {names="peter",grades=10},
       {names="Paul", grades=7},
       {names="Mary",grades=8}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    匿名函数function(a,b)
    
                   ........(你的实现)
    
                  end
    
    • 1
    • 2
    • 3
    • 4
    • 5

    匿名函数中的a,b是传入的table的2个valuetable.sort每次会返回两个value传入比较函数。上例是student中的value

    比较函数是这样的:

    table.sort(students,function (a,b)
          return a.grades>b.grades
    end)
    
    • 1
    • 2
    • 3
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    自定义的比较函数功能十分强大,但是也有一些坑。

    注意:

    • 1.table.sort并不稳定,当条件的两个元素相等时,它们在排序后的相对位置可能会改变(据说,我自己暂未出现,可能用的少)

    • 2.要求需要排序table中间元素不能有nil,否则会报错

    • 3.当比较的两个元素相等的时候,比较函数一定要返回false,返回true会报错,table.sort会根据你返回的bool来判断两个value是否保持原来的顺序

  • 相关阅读:
    Operations Management: What Is It and Why Does It Matter?
    SveletJs学习——运动动画
    Shopee市场爆单难?找准选品逻辑方式
    【LeetCode回溯算法#06】复原IP地址详解(练习如何处理边界条件,判断IP合法性)
    社区系统项目复盘-7
    迅为龙芯开发板系统编译安装pmoncfg
    数据分析:单元2 NumPy数据存取与函数
    Non-local Neural Network
    keil5显示内存和存储占用百分比进度条工具
    什么是网络安全?
  • 原文地址:https://blog.csdn.net/qq_44918090/article/details/125981002