lua的table排序问题
a={7,8,9,7,8,9,7,7,9,6,5,2,2,1}b={}fori=1,#adob[a[i]]=(b[a[i]]or0)+1endtable.sort(b)f...
a={7,8,9,7,8,9,7,7,9,6,5,2,2,1}
b={}
for i=1,#a do
b[a[i]] = (b[a[i]] or 0)+1
end
table.sort(b)
for k,v in pairs(b) do
print(k..":"..v.."\n")
end
我这里想根据table b 的value值(table a数值的出现个数)进行排序,然后输出,但是结果却不行,问题出在哪里呢?
我是想按a中数值出现次数进行降序排序,那个table.sort(b),我试过写成
table.sort(b,function(item1,item2) return item1>item2 end)
table.sort(b,function(item1,item2) return b[item1]>b[item2] end)
输出都不正确。
求解答。 展开
b={}
for i=1,#a do
b[a[i]] = (b[a[i]] or 0)+1
end
table.sort(b)
for k,v in pairs(b) do
print(k..":"..v.."\n")
end
我这里想根据table b 的value值(table a数值的出现个数)进行排序,然后输出,但是结果却不行,问题出在哪里呢?
我是想按a中数值出现次数进行降序排序,那个table.sort(b),我试过写成
table.sort(b,function(item1,item2) return item1>item2 end)
table.sort(b,function(item1,item2) return b[item1]>b[item2] end)
输出都不正确。
求解答。 展开
- 你的回答被采纳后将获得:
- 系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)
2个回答
展开全部
table.sort的功能是把
{300,100,200}排序成 {100, 200, 300}
也就是把
{[1]=300, [2]=100, [3]=200} 排序成 {[1]=100, [2]=200. [3]=300}
但是你的b确是
{[1]=1, [2]=2, [5]=1, [6]=1, [7]=4, [8]=2, [9]=3}
这样 [3]=nil, [4]=nil
当sort遇到[3]=nil就认为数组结束了, 就出错了,
你必须给 [3]=0, [4]=0才行,
即是这样, 排序后数据就变了,
你这里不是对一个数排序, 是对一对数排序,
修改如下:
a={7,8,9,7,8,9,7,7,9,6,5,2,2,1}
b={}
for i=1,#a do
b[a[i]] = (b[a[i]] or 0)+1
end
--把统计结果做成数组
c = {}
n = 0
for k,v in pairs(b) do
n = n + 1
c[n] = {k,v}
end
cmp = function(x,y)
if x==nil then return true end;
if y==nil then return false end;
return ((x[2] < y[2]) or ((x[2] == y[2]) and (x[1] < y[1])) )
end
table.sort(c, cmp)
for i=1, #c do
print(c[i][1]..":"..c[i][2].."\n");
end
{300,100,200}排序成 {100, 200, 300}
也就是把
{[1]=300, [2]=100, [3]=200} 排序成 {[1]=100, [2]=200. [3]=300}
但是你的b确是
{[1]=1, [2]=2, [5]=1, [6]=1, [7]=4, [8]=2, [9]=3}
这样 [3]=nil, [4]=nil
当sort遇到[3]=nil就认为数组结束了, 就出错了,
你必须给 [3]=0, [4]=0才行,
即是这样, 排序后数据就变了,
你这里不是对一个数排序, 是对一对数排序,
修改如下:
a={7,8,9,7,8,9,7,7,9,6,5,2,2,1}
b={}
for i=1,#a do
b[a[i]] = (b[a[i]] or 0)+1
end
--把统计结果做成数组
c = {}
n = 0
for k,v in pairs(b) do
n = n + 1
c[n] = {k,v}
end
cmp = function(x,y)
if x==nil then return true end;
if y==nil then return false end;
return ((x[2] < y[2]) or ((x[2] == y[2]) and (x[1] < y[1])) )
end
table.sort(c, cmp)
for i=1, #c do
print(c[i][1]..":"..c[i][2].."\n");
end
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询