我有两个数组:
x = [ ["0", "#0"], ["1", "#1"] ]
y = [ ["00", "00 description"], ["10", "10 description"] ]
我需要的是合并它们,以便得到以下结果:
result = [ ["000", "#0 00 description"], ["010", "#0 10 description"],
["100", "#1 00 description"], ["110", "#1 10 description"] ]
有没有办法呢?或者我需要使用collect
或类似的东西?
提前致谢。
答案 0 :(得分:2)
在您的示例中,您似乎应用特殊规则来连接整数的特定十进制表示的数字,这不能以任何简单的方式工作(例如,当您编写00
时,它只是0
到翻译)。但是,假设简单的字符串连接是你的意思:
x = [ ["0", "#0"], ["1", "#1"] ]
y = [ ["00", "00 description"], ["10", "10 description"] ]
z = []
x.each do |a|
y.each do |b|
c = []
a.each_index { |i| c[i] = a[i] + b[i] }
z << c
end
end
p z
编辑:最初发布的问题版本将整数作为每个子数组的第一个元素,解决方案的前言指的是那个。此后,该问题已被编辑为具有此处假定的字符串。
答案 1 :(得分:1)
您可以使用Array#product方法:
x = [ ['0', "#0"], ['1', "#1"] ]
#=> [["0", "#0"], ["1", "#1"]]
y = [ ['00', "00 description"], ['10', "10 description"] ]
#=> [["00", "00 description"], ["10", "10 description"]]
x.product(y).map{|a1,a2| [a1[0]+a2[0], a1[1] + ' ' + a2[1]]}
#=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]]
如果您不需要上面的不同类型的连接(第二个插入空间),甚至:
x.product(y).map{|a1,a2|
a1.zip(a2).map{|e|
e.inject(&:+)
}
}
这是一个没有Array#product
的变体,无形的可读性:
x.inject([]){|a,xe|
a + y.map{|ye|
xe.zip(ye).map{|e|
e.inject(&:+)
}
}
}
答案 2 :(得分:1)
在您的示例中,您将连接第一个不带空格的元素,但第二个元素连接空格。如果你能以同样的方式做到这一点,那就可以了:
x.product(y).map {|a,b| a.zip(b).map(&:join)}
=> [["000", "#000 description"], ["010", "#010 description"], ["100", "#100 description"], ["110", "#110 description"]]
如果需要不同的连接,请执行以下操作:
x.product(y).map {|a,b| [a[0]+b[0],a[1]+' '+b[1]]}
=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]]