Lua的 table.sort排序
在用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排序的更多相关文章
- Lua table.sort排序
在用table.sort 排序的时候注意,如果使用多个条件排序,应在一个排序函数里按照条件优先级进行比较排序. 例如 local t = { {time = , i = }, {time = , i ...
- Lua 数组排序 table.sort的注意事项
1. table中不能有nil table.sort是排序函数,它要求要排序的目标table的必须是从1到n连续的,即中间不能有nil. 2. 重写的比较函数,两个值相等时不能return true ...
- Table.Sort排序…Sort(Power Query 之 M 语言)
数据源: 任意查询表 目标: 对其中一列数据进行排序 操作过程: 选取对象>[主页]>[排序]>[升序排序] 选取对象>[主页]>[排序]>[降序排序] M公式: ...
- lua的table.sort
local aa = {{a=11},{a=44},{a=33},{a=2} } table.sort(aa,function(a,b) return a.a>b.a end) for k, v ...
- lua 排序table.sort()用法
table.sort(),它要求要排序的目标table的必须是从1到n连续的,即中间不能有nil.当两个数相等的时候,比较函数一定要返回false. 探究性质,我们做个试验: 1)新建文件sortte ...
- lua的table排序
lua中利用到的排序的基本上就是构造函数(table)了,为了便于和C区分开来,我俗称它为表单. 实例:(原理就是LUA集成的冒泡算法) 排序的一般姿势(对于只包含数字或者只包含字符串的简单数组) t ...
- (转)Lua的table库函数insert、remove、concat、sort详细介绍
原帖链接:http://www.jb51.net/article/64711.htm#comments 有增注标识的地方为额外注释,非原帖内容. 函数列表:(增注:只能用于数组!) table.ins ...
- Lua的table库函数insert、remove、concat、sort详细介绍(转载)
函数列表: table.insert(table,[ pos,] value) table.remove(table[, pos]) table.concat(table[, sep[, i[, j] ...
- LUA table.sort的问题,数组与表的区别
t = { [] = , [] = , [] = , [] = , } t1 = { , , , , } t2 = { 'a', 'b','d','c', } function cmp(v1, v2) ...
随机推荐
- vue中引入css文件
两种方式引入css文件,一种是直接在main.js中引入(也可以在其他的.vue文件中的<script></script>标签中),即下面这种写法: import 'eleme ...
- vue指令
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>指令 ...
- API接口加密方式说明
标签: 接口 2016年10月11日 19:41:20 13299人阅读 评论(0) 收藏 举报 分类: API(5) 版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog ...
- Python模块之sys模块
sys模块是与Python解释器交互的一个接口 有如下方法 sys.argv 命令行参数的一个列表,第一个参数为程序本身的路径 sys.exit(n) 退出程序,正常退出exit(0) ,异常退 ...
- linux基础练习题(1)
Linux命令作业(关卡一) 练习题1 理解操作系统的作用,以及各种操作系统的不同 要求: 简述什么是OS 简述应用程序.硬件.OS的关系 列举出3种常见的操作系统 简述Ubuntu和Linux的关系 ...
- Sqoop使用,mysql,hbase,hive等相互转换
Sqoop 是一款用来在不同数据存储软件之间进行数据传输的开源软件,它支持多种类型的数据储存软件. 安装 Sqoop 1.下载sqoop并加mysql驱动包 http://mirror.bit.edu ...
- Swap file ".hive-site.xml.swp" already exists
1.使用命令[hadoop@slaver1 conf]$ ls -la查找出隐藏文件,然后删除报出来的错误文件. [hadoop@slaver1 conf]$ rm -rf .hive-site.xm ...
- java发送http的get、post请求【备忘】
类 package com.dsideal.kq.Controller; import java.io.BufferedReader; import java.io.IOException; impo ...
- 解决h5网页微信分享链接不能显示缩略
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js& ...
- 秒懂C#通过Emit动态生成代码
首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new AssemblyName("Kitty&qu ...