lua 非ipairs结构的table.sort()实现
上次说到非ipairs结构的table使用table.sort()时,结果花里胡哨的问题,今天来说说如何解决这个问题。
思路:既然原来的数据是非ipairs结构,那么就将原来的table转化成ipairs结构的table-1。将table-1进行table.sort(),再将结果导出即可。
在写下上面这段话后,我开始编写代码。但是,万万没想到啊,你们先看看下面的代码。
代码:
function tableSort(t,callback)
-- body
local tempTable ={}
local returnTable = {}
for k,v in pairs(t) do
local tempValue = {}
tempValue.key = k
tempValue.value = v
table.insert(tempTable,tempValue)
end
if callback then table.sort(tempTable,callback)
else table.sort(tempTable, function (a,b)
return a.value < b.value
end)
end
for i,v in ipairs(tempTable) do
returnTable[v.key] = v.value
end
return returnTable
end
local able = {
[401] = "a",
[403] = "d",
[404] = "b",
[406] = "c"
}
able = tableSort(able)
for k,v in pairs(able) do
print(k,v)
end
结果:
404 b
401 a
406 c
403 d
[Finished in 0.1s]
问题出在了returnTable[v.key] = v.value这段代码,我将值按照顺序赋值过去后,他的遍历顺序居然是按照key的hash值来的。那么要怎么处理这个问题呢?对不起,我还是个菜鸡。所以,我决定直接绕过这个问题一步到位,直接把这个函数变成遍历迭代器。
代码:
function tableSortPairs(t,callback)
-- body
local tempTable ={}
local returnTable = {}
for k,v in pairs(t) do
local tempValue = {}
tempValue.key = k
tempValue.value = v
table.insert(tempTable,tempValue)
end
if callback then table.sort(tempTable,callback)
else table.sort(tempTable, function (a,b)
return a.value < b.value
end)
end
local count = 0
return function ()
-- body
count = count + 1
if tempTable[count] then
return tempTable[count].key,tempTable[count].value
end
end
end
local able = {
[401] = "a",
[403] = "d",
[404] = "b",
[406] = "c"
}
for k,v in tableSortPairs(able) do
print(k,v)
end
结果:
401 a
404 b
406 c
403 d
[Finished in 0.1s]
在写的时候还遇到一个小问题,这里篇幅太长,下一篇再说。