您的位置:首页 > 编程语言 > Lua

lua 非ipairs结构的table.sort()实现

2020-02-04 03:44 357 查看

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]

在写的时候还遇到一个小问题,这里篇幅太长,下一篇再说。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
我是垃圾我不配 发布了14 篇原创文章 · 获赞 2 · 访问量 291 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: