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

例如

local t = {
{time = , i = },
{time = , i = },
{time = , i = },
{time = , i = },
{time = , i = },
{time = , i = },
}

现要求按 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("\t[%d] = {time = %d, i = %d}", i, v.time, v.i))
end
print("}")

排序后结果:

t = {
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
}

此时再按 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("\t[%d] = {time = %d, i = %d}", i, v.time, v.i))
end
print("}")

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

t = {
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
}

然而实际结果却是:

t = {
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
[] = {time = , i = }
}

这应该是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)

Lua table.sort排序的更多相关文章

  1. Lua的 table.sort排序

    在用table.sort 排序的时候注意,如果使用多个条件排序,应在一个排序函数里按照条件优先级进行比较排序. 例如 local t = { {time = , i = }, {time = , i ...

  2. LUA table.sort的问题,数组与表的区别

    t = { [] = , [] = , [] = , [] = , } t1 = { , , , , } t2 = { 'a', 'b','d','c', } function cmp(v1, v2) ...

  3. Table.Sort排序…Sort(Power Query 之 M 语言)

    数据源: 任意查询表 目标: 对其中一列数据进行排序 操作过程: 选取对象>[主页]>[排序]>[升序排序] 选取对象>[主页]>[排序]>[降序排序] M公式: ...

  4. lua table 排序--满足多条件排序

    前提 假设 一个小怪 有三种属性,等级(level).品质(quality).id(pid) 我们需要对他们进行排序,两种排序情况,第一是单一属性排序,比如按照等级进行排序,或者多种属性进行优先级排序 ...

  5. Lua Table 操作

    Lua中table类似与C#种的字典,其实就是一个key-value键值对数据结构.来学习下table基本操作 Table的创建 myTable = {} --表名后面使用{}赋值,表示一个空的表 m ...

  6. lua 排序table.sort()用法

    table.sort(),它要求要排序的目标table的必须是从1到n连续的,即中间不能有nil.当两个数相等的时候,比较函数一定要返回false. 探究性质,我们做个试验: 1)新建文件sortte ...

  7. Lua 数组排序 table.sort的注意事项

    1. table中不能有nil table.sort是排序函数,它要求要排序的目标table的必须是从1到n连续的,即中间不能有nil. 2. 重写的比较函数,两个值相等时不能return true ...

  8. lua table排序报错与解决

    lua table排序 table的sort函数 比如按照大小进行排序,下面这种写法在某些情况下可能会排序错误,甚至报invalid order function for sorting table. ...

  9. Lua 自己实现排序sort比较方法,抛出错误invalid order function for sorting

    明天新功能就要上了,结果刚刚突然QA说项目抛出了错误.握草,吓得立马出了一身汗. 查了一下错误,发现可能是自己写的不稳定排序造成的.自己感觉应该就是.把排序方法写成稳定的之后,代码分离编译进手机,跑了 ...

随机推荐

  1. JAVA - 深入JAVA 虚拟机 2

    类的两种类型的类加载器 -Java虚拟机自带的加载器 根类加载器(Bootstrap): 使用C++编写,programer can not abtain this class. 扩展类加载器(Ext ...

  2. chrome浏览器iframe兼容性问题,隐藏起来再显示滚动条消失?

    前言:在调试页面时发现谷歌浏览器bug,版本: 58.0.3029.81 问题描述: 1. 页面中,选项卡里面是IFrame,页面初始显示时有纵向滚动条出现 2. 来回切换选项卡一次,原来选项卡页面的 ...

  3. CSS命名实践

    前面的话 每次写HTML结构涉及到CSS命名时,都要挣扎一番.关于CSS命名的规范,市面上有不少,如OOCSS.SMACSS.BEM和MVCSS等.在这里面最火的应该算BEM了.本文将详细介绍CSS命 ...

  4. 读Zepto源码之Event模块

    Event 模块是 Zepto 必备的模块之一,由于对 Event Api 不太熟,Event 对象也比较复杂,所以乍一看 Event 模块的源码,有点懵,细看下去,其实也不太复杂. 读Zepto源码 ...

  5. 简单介绍Struts2

    Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...

  6. DDD理论学习系列(11)-- 工厂

    DDD理论学习系列--案例及目录 1.引言 在针对大型的复杂领域进行建模时,聚合.实体和值对象之间的依赖关系可能会变得十分复杂.在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实例化逻 ...

  7. 将csv格式的文件数据导入mysql中

    示例如下: load data infile 'test.csv'into table `test`fields terminated by ',' optionally enclosed by '& ...

  8. linux 在jetty中部署web工程

    背景:公司中原有的项目需要在jetty中进行部署,所以要掌握相关知识. 1 部署步骤 首先要保证jdk环境变量配置正常,然后去官网下载对应版本号的jetty,解压缩即可. 将需要部署的web应用,wa ...

  9. swift 3.0 基础练习 面向对象 类

    模拟需求 创建100个女朋友 1.用面向对象思想 2.名字随机 3.年龄随机 4.拥有约会功能 5.将所有女朋友信息输出 class GirlFirend: NSObject { var name:S ...

  10. 【JAVASCRIPT】ECMAScrip (转)

    部分ECMAScript术语 ECMAScript Sun(现在的Oracle)公司持有着"Java"和"JavaScript"的商标.这就让微软不得不把自己的 ...