从实现求差集介绍lua table需要注意的一些问题

用lua实现的求两个table的差集(只支持一维table)

1、lua table 判空:

table 判空,用的了next()函数。

next()函数说明:运行程序来遍历表中的所有域。 第一个参数是要遍历的表,第二个参数是表中的某个键。 next 返回该键的下一个键及其关联的值。 如果用 nil 作为

第二个参数调用 next 将返回初始键及其关联值。 当以最后一个键去调用,或是以 nil 调用一张空表时, next 返回 nil。 如果不提供第二个参数,将认为它就是 nil

可以用 next(t) 来判断一张表是否是空的。

2、tabale.remove():

table.remove(list[, post]) 移除 list 中 pos 位置上的元素,并返回这个被移除的值。 当 pos 是在 1 到 #list 之间的整数时, 它向前移动元素。不带pos,默认移除最后一个元素。

与tbl[key] = nil相比,赋值nil,table长度不会变短(实际验证会删除,但是建议使用remove删除

正因为删除后,剩余的元素向前移动,所以不能在循环中这样使用(下面代码是错误的)

因为在table表中使用for迭代时,将符合条件的元素删除时,后面元素前移,然后产生跳跃,而使用for i=1,#mytable 这样的循环时,由于在for时就已经确定了循环的终点是table的总长度,

在整个for运行过程中,终点不会改变。所以当你删除元素时,在循环到i = #mytable 时,会报错nil。因为此时table长度已经缩短了,所以特别注意不能在循环中删除table

3、table 的排列顺序:

lua table并非像数组一样顺序存储的,更加像是C++中的map,通过Key对应存储Value,但是并非顺序来保存key-value对,而是使用了hash的方式,这样能够更加快速的访问key对应的value。

所以遍历时并非是table的排列顺序,而是根据key的hash之排列的顺序遍历的

4、table 赋值:

lua当变量作为函数的参数进行传递时,类似的也是boolean,string,number类型的变量进行值传递。而table,function,userdata类型的变量进行引用传递,table的赋值实质也是引用。

例如:local table_a = table_b,在修改table_a时,table_b也修改了。

所以要赋值table需要这样操作:

原文地址:https://www.cnblogs.com/pk-tiger/p/11739901.html

时间: 2024-10-11 18:19:31

从实现求差集介绍lua table需要注意的一些问题的相关文章

LUA table

1 table实现介绍 脚本table中的元素在c中是分两个地方存放的,即数组与hash表.table中元素的位置也不是一直固定的,它会根据table被修改的情况动态改变.下面分两种情况说一下table的特点,我们首先要知道在lua中,索引值可以为负数也可以为正数,当为负数的话,top为-1,当为正数第一个压入栈的元素为1,依此类推,如果构造table的时候指定了key的值,不管key是何值,也会将key进行hash.比如 t1 = { [1] = 100, [2] = 200, [3] = 3

List<T> 求差集

List<int> a = new List<int>() { 1, 2, 3, 6, 8, 7 }; List<int> b = new List<int>() { 1, 2, 3, 4, 5, 6 }; List<int> c = b.Except(a).ToList(); foreach (int i in c) { Console.WriteLine(i); //4 5 } Console.Read(); List<T> 求差

lua table integer index 特性

table.maxn (table) Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices. (To do its job this function does a linear traversal of the whole table.) 返回表中最大的正数值index. 说明: 1. 此接口不是统计表中元素的

Lua table pair和ipair区别

官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction for i,v in ipairs(t) do body end will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table. pairs (

Lua table 的长度问题

直入主题 我们要取lua table的长度时习惯这样 local tb = {1,2,3,4} print(#tb) 这时候,输出理所当然的是4,如果在程序中我们需要判断长度时使用这样的方法,再看一下 tb[1] = nil print(#tb) 输出还是4,似乎有点背离我们的意愿 我们想知道这个table里面是不是有4个值,但是有一个值被置空了,输出结果却没有及时告诉我们 发生这样问题的原因是,lua在初始化table的时候,会给这个table分配值存储的空间,代码里面tb初始化包含4个数字值

树形打印lua table表

local print = print local tconcat = table.concat local tinsert = table.insert local srep = string.rep local type = type local pairs = pairs local tostring = tostring local next = next function print_lua_table (lua_table, indent) if not lua_table or t

hive 求差集

hive求差集的方法 1.什么是差集 set1 - set2,即去掉set1中存在于set2中的数据. 2.hive中计算差集的方法,基本是使用左外链接. 直接上代码 select * from table1 t1 left outer join table2 t2 on t1.id = t2.id where t2.id = null; 3.一般来说我们要先去重,使得两个表都变成集合,元素唯一. 先对table2(右表)去重然后再计算差集. select * from ( select * f

Silverlight项目笔记6:Linq求差集、交集&amp;检查网络连接状态&amp;重载构造函数复用窗口

一.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所以需要通过对数据中心以及系统现有用户信息进行比较,分为三部分: (1) Linq取差集,找出需要删除的用户数据,进行删除(USERNAME为唯一值字段). 使用的是Except这个方法. (2)使用Linq提供的Intersect方法,取得两个用户集合的交集,遍历检查进行更新. (3)同样再次取差集

jquery 数组求差集,并集

var alpha = [1, 2, 3, 4, 5, 6], beta = [4, 5, 6, 7, 8, 9]; $.arrayIntersect = function(a, b){ return $.merge($.grep(a, function(i) { return $.inArray(i, b) == -1; }) , $.grep(b, function(i) { return $.inArray(i, a) == -1; }) );}; window.console &&