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

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]

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值