[Lua语言基础]-10、表

[复制链接]
查看1679 | 回复1 | 2021-8-17 21:46:23 | 显示全部楼层 |阅读模式
本帖最后由 Aitlo 于 2021-8-17 21:49 编辑
  1. -- 表(table)的定义
  2. --[[Table是lua的一种数据结构用来帮助我们创建不同的数据类型,如:数组、键值对、集合等
  3. lua(数组)的基本特征与定义
  4. lua(数组)的下标可以是负数
  5. lua的长度可以动态改变(与C#的固定长度数组不同),可以把lua数组认为是C#的List、Dictionary等集合类型。
  6. 把Table 当成一个“字典”集合来对待。也可以当成一个“数组”来对待,这要看如何来初始化表。

  7. --]]

  8. -- 定义一个简单的表
  9. tabMayArray = {}
  10. -- 输出
  11. print(tabMayArray)                -- table: 02AC2090 表的地址
  12. -- 表的赋值
  13. tabMayArray = {11,22,88}
  14. print(tabMayArray[1])        -- 使用下标输出,注意:这要下标是从1开始的
  15. print(tabMayArray[2])        -- 使用下标输出
  16. print(tabMayArray[3])        -- 使用下标输出
  17. print(tabMayArray[0])        -- nil


  18. -- 定义“数组”类型的表
  19. tabMayArray2 = {10,20,30,88}        -- 相当于“数组”类型

  20. -- 定义“键值对”类型的表
  21. tabMayArray3 = {str1="张三",str2="李四",str3="王五"}
  22. -- 输出
  23. print(tabMayArray3['str1'])        -- 使用中括号输出
  24. print(tabMayArray3.str2)        -- 使用“.”输出(类似C#中输出的属性)
  25. print(tabMayArray3.str3)        

  26. --[[Table 集合,可以又“空表”、“直接声明定义表内容”、“声明表然后逐一赋值”等三种方式
  27. Table 集合,也可以定义类似“数组”的定义方式,其访问可以使用下标进行访问。(注意:lua 中没有数组的概念,就是表来表示)
  28. 访问table 中数据(“键值对”类型集合),可以直接用.符合访问,也可以使用中括号访问,但是一定要加字符串!(否则会报错)
  29. Table 中的索引,都是从1开始的。
  30. --]]

  31. -- 表的赋值与迭代输出
  32. --[[空表的赋值与迭代输出
  33. 字典类型表赋值与迭代输出
  34. 关于变量相互赋值的技术(引用传递)
  35. --]]

  36. -- 学习表的迭代输出(数组类型)
  37. tabMayArray4 = {12,20,3,50,66}
  38. --输出
  39. for i=1,4 do
  40.         print(tabMayArray4[i])
  41. end

  42. -- 使用table 函数或者符合输出
  43. for i=1,#tabMayArray4 do                                -- 使用 “#”符合,得到表中数量
  44.         print(tabMayArray4[i])
  45. end

  46. for i=1,table.getn(tabMayArray4) do                -- 使用表内置函数,得到表的数量
  47.         print(tabMayArray4[i])
  48. end

  49. -- 学习表的迭代输出(“键值对”类型)
  50. tabMayArray5 = {str1="张三",str2="李四",str3="王五"}        -- 定义表,且表直接赋值
  51. tabMayArray5.str1 = '小明'
  52. tabMayArray5['str2'] = '小红'

  53. -- 输出
  54. for i=1,5 do
  55.         print(tabMayArray5['str'..i])
  56. end

  57. -- 使用迭代器函数输出
  58. --[[ipairs 函数
  59.         输出连续数值
  60. pairs 函数
  61.         输出连续与非连续(键值对)数值
  62. “#” 符合,除了可以去的字符串长度,还可以取得表的长度。--]]

  63. -- 学习使用迭代器函数(ipairs,pairs)
  64. tabMayArray6 = {str1="张三",str2="李四",str3="王五"}
  65. for k,v in pairs(tabMayArray6) do
  66.         print(k,v)
  67. end

  68. -- 输出字符串类型的数组
  69. tabMayArray7 = {'张三','李四','王五'}
  70. for k,v in ipairs(tabMayArray7)do
  71.         print(v)                -- 注意:一般数组类型的集合,可以输出v 即可。
  72. end
复制代码
  1. -- 表的内置函数
  2. --[[table.getn() 得到表(数组类型)的长度个数
  3.         注意:本函数不能正确输出“键值对”类型表的长度个数。(“#”符合同理)
  4. table.concat()        表的链接。
  5.         功能:把表中的数据进行连接后输出(字符串)
  6. table.insert()        表的插入
  7.         注意:本函数中插入的位置数值,1表示开头位置,2表示第2数据块的位置插入。依次类推。
  8. table.remove()        表的移除
  9.         注意:默认移除最后的序号--]]
  10.         
  11. -- 学习表的内置函数

  12. -- 得到表的长度
  13. tab1 = {'张三','李四','王五'}
  14. print(#tab1)                                -- 输出表的长度
  15. print(table.getn(tab1))        -- 输出表的长度
  16. -- 注意:对于“键值对”类型集合表,不能应用
  17. tab2 = {name1='张三',name2='李四',name3='王五'}
  18. print(#tab2)                                -- 输出结果: 0
  19. print(table.getn(tab2))        -- 输出结果: 0

  20. -- 学习表的链接,输出结果是字符串
  21. tab3 = {'张三','李四','王五'}

  22. str2=table.concat(tab3)
  23. str3=table.concat(tab3,'-')                -- 添加一个分隔符 “-”
  24. str4=table.concat(tab3,'-',2,3)                -- 添加一个分隔符 “-”,且输出指定序号内容字符串
  25. print(str2)                -- 输出结果: 张三李四王五
  26. print(str3)                -- 输出结果: 张三-李四-王五
  27. print(str4)                -- 输出结果: 李四-王五

  28. -- 学习表的插入
  29. tab4 = {'hell','Hi','win'}
  30. -- 插入数据
  31. table.insert(tab4,2,'o')
  32. print(table.concat(tab4))                -- 输出结果:helloHiwin


  33. -- 学习表的移除
  34. tab5 = {1,2,3,4,5,6}
  35. table.remove(tab5)
  36. print(table.concat(tab5))                -- 输出结果:12345         不加指定序号 函数默认移除最后序号的数据
  37. table.remove(tab5,2)
  38. print(table.concat(tab5))                -- 输出结果:1345         加指定序号 移除指定序号数据

  39. --[[table.sort()        表的排序
  40.         注意:对于英文字符串类型,安装a、b、c、d...z的顺序,且先大写后小写的顺序。
  41. table.maxn()        得到表中最大数值,系统函数有bug。改为自定义函数。
  42.         注意:lua中,必须先定义函数,在调用,顺序不能返。--]]
  43.         
  44. -- 学习表的排序
  45. tab6 = {5,6,9,7,10,5,2,1}
  46. table.sort(tab6)
  47. print(table.concat(tab6))                -- 输出结果:125567910
  48. tab7 = {'你好','河流','zoo','room','bus'}
  49. table.sort(tab7)
  50. print(table.concat(tab7))                -- 输出结果:busroomzoo河流你好

  51. -- 获取表中最大数值
  52. tabMaxArray = {12,30,55,1,50,66,100,120,5,3,999}
  53. -- 取得最大数值
  54. nMaxNumber = table.maxn(tabMaxArray)        -- 输出了表的长度而不是表中最大的数值
  55. print('表中最大的数值='..nMaxNumber)

  56. -- 自定义求表中最大的一个函数
  57. -- 输入:‘tabParameter’:表类型的输入变量(如果不合法,则输出nil)
  58. -- 输出:表中最大数值
  59. -- 方法一
  60. function GetTableNumber1(tabParameter)

  61.         if type(tabParameter) == 'table'then
  62.                 table.sort(tabParameter)
  63.                 return tabParameter[#tabParameter]
  64.         else
  65.                 return nil
  66.         end
  67. end

  68. MaxNumber = GetTableNumber1(tabMaxArray)
  69. print(MaxNumber)                -- 输出结果:120

  70. -- 方法二
  71. function GetTableNumber2(tabParameter)
  72.         n = 0
  73.         if type(tabParameter) == 'table'then
  74.                 for k,v in pairs(tabParameter)do
  75.                         if v > n then
  76.                                 n = v
  77.                         end
  78.                 end
  79.                 return n
  80.         else
  81.                 return nil
  82.         end
  83. end
  84. MaxNumber = GetTableNumber2(tabMaxArray)
  85. print(MaxNumber)                -- 输出结果:120
复制代码



回复

使用道具 举报

时之刃 | 2021-8-19 22:18:35 | 显示全部楼层
这个讲解十分全面,赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则