2011-12-16 7 views
-2

は、どのように私はここから行くことができます:2つの配列のアイテムをどのように織り交めることができますか?

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

その後、2,3,43,4,5 -> 2,3,4,3,4,5を返しなります。これは単なる例であり、実際の使用ではありません。

代わりに、2,3 3,4 4,5 -> 2,3,3,4,4,5を返信します。私はputのそれぞれをnumberの可能な値のそれぞれについて反復させたいと思います。この場合、12は、次のputsに移動する前に 'number'の2つの値になります。

これを行う1つの方法は、[2,3,4][3,4,5]の2つのリストを作成してから、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を使用して配列に変換します。連続した要素の各アレイの所与のブロック反復

riドキュメントから

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

:それは、単一の配列を取得するために平坦化することができる配列の配列を返します。 ブロックが指定されていない場合は、列挙子を返します。たぶん

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 } } 
関連する問題