其他编程语言中的几乎所有数据结构都可以用table来实现,,而且table的功能更加强大。
通过数字索引(整数下标)即可在table中创建数组
数组大小可以动态改变,数组元素可以是任意的数据类型.
数组元素的类型与大小都可以自由的改变.
注意在LAScript中约定数组下标从1开始(c++是从0开始),
从1开始更容易理解.标准库所有函数遵循这个约定.
1、通过索字索引(即整数下标)创建数组
3、 获取数组大小
4、通过for循环遍历数组
5、通过泛型for循环遍历数组
1、用table建立矩阵
--用同样的方法建立三角矩阵(节省一半的内存空间)
3、用table建立矩阵方法三
4、用table建立稀疏矩阵
这在其他编程语言中是一个难题,但是table先天就是具有稀疏的特性:
了解这个特性就可以用前面介绍的几种方法建立稀疏矩阵了,这不需要任何复杂的技术.
--[[初始化二维表]]
function table.mk2(m,n)
tab={};
for i=1,m,1 do
tab[i]={};
for j=1,n,1 do
tab[i][j]=j;
end;
end;
return tab;
end;
--[[在控制台显示二维表]]
function table.dir2(tab)
for i,tab2 in ipairs(tab) do --遍历数组tab
print(unpack(tab2)); --展开tab2,作为print的多个参数显示一行多列
end;
end;
tab=table.mk2(3,4); --制作一张3行4列的表格
--table.save(tab,"c:\\xx.xml") --用xml文件保存制作的表格数据
win.consoleOpen();
table.dir2(tab); --在控制台显示二维表
队列作为特定的数据结构,最先进入的元素最先释放(先进先出)
首先,我们定义队列结构.
LAScript采用垃圾收集算法的并且字符串不可变的语言,与其他类似的语言一样在连接字符串时会比较占用资源.
因为每次连接都要创建新的字符串,
如果在一个循环中进行大量的连接操作,效率是很低下的.
因为随了不断的连接字符串变的越来越大,每次连接都要重新拷贝新的副本创建新的字符串。
Java、C#等提供StringBuffer来改善这种情况。
在LAScript中如果需要大量的连接,可以简单的把字符串按顺序添加到一个table数组中。
然后
使用table.concat(tab,"分隔符")来合并字符串. 使用这种方法连接字符串速度非常快。
table.concat(tab,sep,i,j);有四个参数,分别为table数组,分隔符,起始索引,结束索引。
后面的三个参数都可以省略。
我们还可以进一步的优化这种方法。将字符串添加到table数组中以后,检查较小的字符串进行合并.
遇到较大的字符串以后停止合并,这样可以避免生成太大的table数组。
这与经典的汉诺塔问题类似:位于栈下面的串肯定比上面的长,
只要一个较长的串入栈后比它下面的串长,就将两个串合并成一个新的更大的串
,新生成的串继续与相邻的串比较如果长于底部的将继续进行合并,循环进行到没有串可以合并或者到达栈底。
下面我们看示例代码:
string.buffer = function(chr)
local buf = {"",chr=chr}; --创建一个新的缓冲区
--转换为字符串,table.concat合并字符串速度很快
function buf:tostring()
return table.concat(self,self.chr,1,2)
end;
--这个函数添加一个字符串到缓冲区
function buf:add(str)
table.insert(self, str) -- 添加新的字符串到缓冲区中
for i=table.getn(self)-1, 1, -1 do --从顶端开始向下检查缓冲区
if string.len(self[i]) > string.len(self[i+1]) then
break;--直到遇到一个较小的字符串中断循环
end
--如果前面是一个较小的元素,将这个字符串与顶端的字符串连接,并移除顶端的字符串
if(chr)then
self[i] = self[i] ..chr..table.remove(self);
else
self[i] = self[i] .. table.remove(self);--table.remove弹出一个元素并返回其值
end;
end
end
--重载tostring操作符;
buf.__tostring = buf.tostring;
--重载字符串连接操作符
buf.__concat = function(s,s2)
if(type(s)=="table")then --操作数是不是字符串缓冲?
s = s:tostring()
end;
if(type(s2)=="table")then --操作数是不是字符串缓冲?
s2 = s2:tostring()
end;
return s..s2;
end;
--添加一个元表(自已作为自已的元表),重载tostring操作符
setmetatable(buf,buf);
return buf;
end
bf = string.buffer();
bf:add("字符串1");--压入缓冲,准备连接
bf:add("字符串2");--压入缓冲,准备连接
bf:add("字符串3");--压入缓冲,准备连接
bf:add("字符串4");--压入缓冲,准备连接
bf:add("字符串5");--压入缓冲,准备连接
bf:add("字符串6");--压入缓冲,准备连接
win.messageBox( tostring(bf) );--强制转换为字符串