我如何交织两个数组中的项目?

时间:2011-12-16 15:01:29

标签: ruby iterable

我怎么能这样做:

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。我想为每个可能的数值值迭代每个put;在这种情况下,12是'number'的两个可能值,然后再转到下一个看跌期。

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

3 个答案:

答案 0 :(得分: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 :(得分: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 } }

答案 2 :(得分:-1)

[1, 2, 3].each { |i| [1, 2].each { |y| puts i + y  } }