lua能不能两数组相加?
lua吧
全部回复
仅看楼主
level 5
比如 a={"x","y"} b={"1","2"} ,现在需要定义一个新数组c,让它等于a+b
输出结果为
c [ 1 ] ="x"
c [ 2 ] ="y"
c [ 3 ] ="1"
c [ 4 ] ="2"
那么写法是不是 c=a+b ?
2015年08月23日 01点08分 1
level 11

2015年08月23日 06点08分 2
具体怎么个写法?
2015年08月23日 06点08分
level 11
metetable表那课就是教这个的
2015年08月23日 06点08分 3
level 11
等等我用电脑写手机写太慢了,,,
2015年08月23日 06点08分 4
好的。谢谢你啊
2015年08月23日 06点08分
level 11
mt={} 抱歉睡了一觉,,,,代码马上贴上来
2015年08月23日 08点08分 5
怎么写?
2015年08月23日 09点08分
level 11
do--in
local mt={}
local tyx={"number","string","table","function"}
local function into(x,rom,seen,n)--1
for i,v in pairs(x) do--2
if seen[v]~=nil then--3
for i in ipairs(tyx) do--4
if type(v)==tyx[i] then--5
n[i]=1
table.insert(rom[i],v)
seen[v]=true
end--1
end--2
end--3
end--4
for i in ipairs(rom) do--6
table.sort(rom[i])
end--5
end--6
local function chi(x,y,rom)
if y==1 then
for i,v in pairs(rom) do
table.insert(x,v)
end
end
end
mt.__add=function (x,y)
local seen,rom={},{{},{},{},{}}
local n={0,0,0,0}
local ret={}
into(x,rom,seen,n)
into(y,rom,seen,n)
for i=1,4 do
chi(ret,n[i],rom)
end
return ret
end
function opin(x)--外调
setmetatable(x,mt)
end
end--out
代码不知道哪里出错了...压代码后就搞不定了,,,原理就是使用metatable表,setmetatable(aim,newmetatable)
而newmetatable.__add是个function 参数是x,y
如果你定义function newmetatable.__add(x,y) 并且用setmetatable这个函数取代表里原来的metatable表,就可以改变原来的加法运算了,例a=1+2,会调用a的newmetatable表里的__add函数,且参数为1,2(等价于 a=newmetatable.__add(1,2))
原理就是这个,你的目标实现方法就是遍历你要加的两个数组且把里面的数据加入到另一个数组,再返回另一个数组。
2015年08月23日 09点08分 6
这个办法太麻烦了
2015年08月23日 09点08分
回复
�峤ؼ����͵ţ
:不用metatable表的话就简单啦
2015年08月23日 09点08分
还不如用我的for循环
2015年08月23日 09点08分
回复
�峤ؼ����͵ţ
:只是我加了分类和避免重复代码为了不写长代码就压缩了,,,就麻烦了呗
2015年08月23日 09点08分
level 11
do
local mt={}
function mt.__add(x,y)
ret={}
for i,v in pairs(x) do
table.insert(ret,v)
end
for i,v in pairs(y) do
table.insert(ret,v)
end
return ret
end
function set(x)
setmetatable(x,mt)
end
end
这是简单版的,你一看就东的
2015年08月23日 09点08分 7
level 11
这帖子好迷……
lua原生肯定是不支持table的直接加法的,你可以通过metatable来实现这样的行为,然而c = a+b,这样的行为要求a或者b的metatable里面定义了__add,也就是说不能一次性地让所有的table都愉悦地相加(当然这样的话很危险)
所以如果需要这样的功能就直接遍历,非要弄出加法来就去搞metatable
最后就是你这个加法的逻辑是直接concat还是取并集啊?
2015年08月25日 14点08分 8
concat
2015年08月25日 14点08分
这个问题我已经解决了,取a b的长度以后for循环,依次填入C,方法是笨,但是管用[黑线]
2015年08月25日 14点08分
回复 村长丶那人偷牛 :取长度干嘛,直接遍历a的元素插入c然后遍历b的元素插入c就行了
2015年08月25日 14点08分
回复 村长丶那人偷牛 :LS是以为你要实现+的操作符重载了……其实你只是想实现一个数组的concat吧……
2015年08月25日 14点08分
level 11
local a = {1,2}
local b = {3,4}
local c = {}
for _,v in ipairs(a) do
table.insert(c,v)
end
for _,v in ipairs(b) do
table.insert(c,v)
end
print(c)
这样就行了,手机敲代码好烦……
2015年08月25日 14点08分 9
你的办法智能一点,适用于多个数组相加,受教了,谢谢你啊[哈哈]
2015年08月25日 15点08分
回复 村长丶那人偷牛 :不客气,加油[哈哈]
2015年08月25日 15点08分
level 5
@同在二要
for i=1, table.getn(a) + table.getn(b) do
if i <= table.getn(a) then
c[i] = a[i]
elseif i <= table.getn(a) + table.getn(b) then
c[i] = b[i - table.getn(a)]
end
end
2015年08月25日 14点08分 10
好好好我了解了……你试试上面的方法,这方法比较迷
2015年08月25日 15点08分
@同在二要 我这个办法也是让c=a+b,你可以看看
2015年08月25日 15点08分
回复 村长丶那人偷牛 :这个方法里面有C/C++的影子……lua不必如此,其实就算是C/C++也多是两个循环,下标直接算出来(好吧其实更常见还是指针和迭代器orz)
2015年08月25日 15点08分
回复
ͬ�ڶ�Ҫ
:对了,如果要让a和b的项倒过来插入,改怎么办?c[1]=2, c[2]=1 这样的方式
2015年08月25日 15点08分
level 5
@同在二要
for i,v in ipairs(a) do
c[table.getn(a)-i+1] = v
end
[哈哈] 怎么样,这个办法?
2015年08月25日 15点08分 11
@同在二要 我只是把table.insert 改成了直接c[]=v的形式
2015年08月25日 15点08分
回复 村长丶那人偷牛 :你知道table.insert的好处嘛……就是不用计算下标了
2015年08月25日 15点08分
回复 村长丶那人偷牛 :一方面麻烦,另一方面可读性差,你过几天回头改这个代码还要现看肯定嫌烦,程序猿总得学会为自己省点力不是……
2015年08月25日 15点08分
回复
ͬ�ڶ�Ҫ
:也对 。谢谢指导[哈哈]
2015年08月25日 15点08分
level 1
newTable = {unpack(table1),unpack(table2}
2018年09月21日 13点09分 13
1