Lua pairs 和 ipairs tabel存储

先看要给简单的示例

print('test pairs and ipairs')
local t =
{
    [1] = 1,
    2,
    [3] = 3,
    4,
    [5] = 5,
    [6] = 6
}

print('ipairs  ')
for i, v in ipairs(t) do
    print(v)
end


print('pairs  ')
for i, v in pairs(t) do
    print(v)
end

输出:
test pairs and ipairs
ipairs  
2
4
3
pairs  
2
4
5
6
3

是不是非常的神奇?
为什么会出现会这样的结果,

就要先来看看lua 中table时怎么存储数据的

Table的组成:
1.哈希表 用来存储Key-Value 键值对,当哈希表上有冲突的时候,会通过链表的方式组织冲突元素
2.数组 用来存储 数据(包括数字,表等)
通过示例来解析一下。

  1. 先将元素按照类型存储为键值对和数组
    key_value = {[1]=1,[3]=3,[5]=5,[6] =6}
    数组={2,4}
  2. 将数组转换为哈希存储的时候,数组变成了{[1]=2,[2]=4}
    但此时哈希表里已经有[1]=1的键值对,会发生冲突,则会重新进行关联配对。将原有的[1]=1和新的值配对,变成了[1]= 2。
    此时哈希表的内容时{[1]=2,[2]=4,[3]=3,[5]=5,[6]=6}

纯数值的table 时按照数值进行排序的,那么对于混合数据来说,按照什么顺序排列呢?
table的内存分配最终都是按照键值对来分配到。
首先大的分类还是先哈希再数组。对于最终的哈希表顺序,是按照键的哈希值来排序的,不是字母也不是数字。
给出几个示例来验证下。

local testTab ={1,2,3,4,5};
-- '纯表'
local testTab1 = {a = 1, b = 2, c =3};
-- '杂表1'
local testTab2 = {"zi",a = 5,b = 10, c = 15,"miao","chumo"};
-- '杂表2'
local testTab3 = {"zi",a = 5,b = 10, c = 15,"miao",nil,"chumo"};

print("数值表")
print('ipairs  ')
for i, v in ipairs(testTab) do
    print(v)
end

print('pairs  ')
for i, v in pairs(testTab) do
    print(v)
end
print("-------------------")

print("纯表")
print('ipairs  ')
for i, v in ipairs(testTab1) do
    print(v)
end

print('pairs  ')
for i, v in pairs(testTab1) do
    print(v)
end
print("-------------------")

print("杂表1")
print('ipairs  ')
for i, v in ipairs(testTab2) do
    print(v)
end

print('pairs  ')
for i, v in pairs(testTab2) do
    print(v)
end
print("-------------------")

print("杂表2")
print('ipairs  ')
for i, v in ipairs(testTab3) do
    print(v)
end

print('pairs  ')
for i, v in pairs(testTab3) do
    print(v)
end
print("-------------------")

输出结果:


Lua pairs 和 ipairs tabel存储_第1张图片
image.png

因此可以总结一下ipairs 和 pairs的遍历的区别:

ipairs( i开头的巧记 int类型的数值开头只是为了助记 不是实际含义)

遍历的索引的特点

1.必须是从1开头的 int类型的连续整数 1 2 3 4 5 6 7 8 9 …………………..
2.索引不能断开,断开则终止遍历(当存在nil 类型的数据)

循环结束条件

1.索引断开
2.下一个索引不存在

pairs

遍历的索引的特点

1.遍历的顺序是随机的,但是一定会遍历整个表
2.pairs是先按照索引值打印(数字型key,可以用[ ]访问),然后打印哈希(键值对)

循环结束条件

1.所有元素遍历完毕

你可能感兴趣的:(Lua pairs 和 ipairs tabel存储)