2011-12-16 45 views
-2

如何从这个去:如何交织两个阵列中的物品?

for number in [1,2] do 
    puts 1+number 
    puts 2+number 
    puts 3+number 
end 

将返回2,3,4然后3,4,5 -> 2,3,4,3,4,5。这只是一个例子,显然不是真正的用途。我想让它返回2,3 3,4 4,5 -> 2,3,3,4,4,5。我希望对每个可能的数值进行迭代,在这种情况下,12是“数字”的两个可能值,然后再转到下一个投入。

执行此操作的一种方法是创建两个列表,[2,3,4][3,4,5],然后使用zip方法将它们组合为[2,3,4].zip([3,4,5]) -> [2,3,3,4,4,5]

回答

2

zip很好。你也应该看看each_cons

1.9.2p290 :006 > [2,3,4].each_cons(2).to_a 
=> [[2, 3], [3, 4]] 
1.9.2p290 :007 > [2,3,4,5,6].each_cons(2).to_a 
=> [[2, 3], [3, 4], [4, 5], [5, 6]] 
1.9.2p290 :008 > [2,3,4,5,6].each_cons(3).to_a 
=> [[2, 3, 4], [3, 4, 5], [4, 5, 6]] 

因为each_cons返回一个枚举,您可以使用块吧,如文档中提到了它,或将其转换为使用to_a像我上面做了一个阵列。返回数组的数组,其可以被压平以获得一个单一的阵列:

[2,3,4,5].each_cons(2).to_a.flatten 
=> [2, 3, 3, 4, 4, 5] 

ri文档:

迭代连续元件的每个阵列的给定的块。如果没有给出 块,则返回一个枚举器。

e.g.: 
    (1..10).each_cons(3) {|a| p a} 
    # outputs below 
    [1, 2, 3] 
    [2, 3, 4] 
    [3, 4, 5] 
    [4, 5, 6] 
    [5, 6, 7] 
    [6, 7, 8] 
    [7, 8, 9] 
    [8, 9, 10] 
-1
[1, 2, 3].each { |i| [1, 2].each { |y| puts i + y } } 
0

也许不是最可读的代码,但你可以使用第一个范围注入到创建基于总结了第二范围的数组。

(1..3).inject([]){|m,n| (1..2).each{|i| m<<n+i }; m } 
=> [2, 3, 3, 4, 4, 5] 

这可能是多一点可读

res=[] 
(1..3).each{|r1| (1..2).each{|r2| res<<r1+r2 } }