zoukankan      html  css  js  c++  java
  • Lua的 table.sort排序

    在用table.sort 排序的时候注意,如果使用多个条件排序,应在一个排序函数里按照条件优先级进行比较排序。

    例如

    local t = {
            {time = 2, i = 1},
            {time = 5, i = 2},
            {time = 0, i = 2},
            {time = 3, i = 4},
            {time = 1, i = 5},
            {time = 4, i = 2},
        }

    现要求按 i 排序,i 相同时按 time 排序,

    假如用两次排序

    1、先用time排序

    table.sort(t, function(t1, t2) return t1.time > t2.time end)
    print("t = {")
    for i, v in ipairs(t) do
        print(string.format("	[%d] = {time = %d, i = %d}", i, v.time, v.i))
    end
    print("}")

    排序后结果:

    t = {
            [1] = {time = 5, i = 2}
            [2] = {time = 4, i = 2}
            [3] = {time = 3, i = 4}
            [4] = {time = 2, i = 1}
            [5] = {time = 1, i = 5}
            [6] = {time = 0, i = 2}
    }

    此时再按 i 排序

    table.sort(t, function(t1, t2) return t1.i > t2.i end)
    
    print("t = {")
    for i, v in ipairs(t) do
        print(string.format("	[%d] = {time = %d, i = %d}", i, v.time, v.i))
    end
    print("}")

    期望 i 相等时(i = 2)能得到和按 time 排序后的一样的相对位置,即:

    t = {
            [1] = {time = 1, i = 5}
            [2] = {time = 3, i = 4}
            [3] = {time = 5, i = 2}
            [4] = {time = 4, i = 2}
            [5] = {time = 0, i = 2}
            [6] = {time = 2, i = 1}
    }

    然而实际结果却是:

    t = {
            [1] = {time = 1, i = 5}
            [2] = {time = 3, i = 4}
            [3] = {time = 5, i = 2}
            [4] = {time = 0, i = 2}
            [5] = {time = 4, i = 2}
            [6] = {time = 2, i = 1}
    }

    这应该是table.sort的内部排序算法造成的。

    所以,在多个条件下排序需要一个排序函数,只调用table.sort()一次。而且多次排序也影响性能。

    table.sort(t, function(t1, t2) 
        if t1.i == t2.i then
            return t1.time > t2.time
        else
            return t1.i > t2.i
        end
    end)
  • 相关阅读:
    hdu 1231 最大连续子序列
    数据加载初始化问题
    分页查询
    PHP-引入文件(include)后,页面错位,不居中解决办法
    数据库中的事务和锁(乐观、悲观锁,共享、排他锁,死锁)
    java操作excel 工具类
    微信公众号处理
    java实用资料
    【转】字符流和字节流的区别,使用场景,相关类
    基于redis分布式锁实现“秒杀”
  • 原文地址:https://www.cnblogs.com/YYRise/p/7419123.html
Copyright © 2011-2022 走看看