2010-03-31 67 views
2

我有两个数组:串联阵列项目

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

究竟你是什么意思时,你说'000 '?这些应该是字符串吗? – 2010-03-31 14:29:21

+0

是的,字符串。对不起。 – 2010-03-31 14:32:10

回答

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(&:+) 
    } 
    } 
} 
+0

几乎相同! – 2010-03-31 14:49:12

+0

完美。谢谢! – 2010-03-31 14:59:27

+1

@glenn:yup ... :)根据问题的原始版本,我没有想到'join',但是再一次,我在脑海中以及字符串都有数字。 – 2010-03-31 15:00:22

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 

编辑:问题的最初发布的版本有整数作为每个子阵列的第一要素,序言中的解决方案是指。这个问题已经被编辑成具有这里假定的字符串。

+0

当然,您可以使用更具体的应用程序来替换'a.each_index'循环,例如'C [0] = A [0] * 100 + B [0]'。 – Arkku 2010-03-31 14:20:57

+0

+1。是的,可以是字符串连接。但我正在寻找更漂亮的方式来做到这一点......这看起来不漂亮。无论如何。 – 2010-03-31 14:29:54

+0

伙计。这是一个7线解决方案。即使你找到一个班轮,它几乎肯定不会像这个那样干净和容易理解。为什么它必须是“漂亮”?它适合你的屏幕并完成工作,这就是所有重要的事情。 – ryeguy 2010-03-31 14:38:54

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"]] 
+0

看起来像是我更新Ruby安装的时候了;没有'产品'在我的。 =) – Arkku 2010-03-31 14:59:38

+0

@Arkku,如果你不能升级到1.9,你会很高兴知道'产品'已经回到1.8.7。如果你不能升级到1.8.7,那么“backports”宝石应该有它。 – 2010-03-31 16:26:34