两个范围的Ruby数组

时间:2013-01-30 20:05:06

标签: ruby multidimensional-array range

我一直在寻找一种创建数组的方法:

[[1,1], [1,2], [1,3]
[2,1], [2,2], [2,3]
[3,1], [3,2], [3,3]]

现在我想出了这个解决方案:

w=3 # or any int
h=3 # or any int
array = []
iw=1
while iw<=w do
  ih=1
  while ih <=h do
    array<<[iw, ih]
    ih+=1
  end#do
  iw+=1
end#do

但是,我确信必须有更快的方式..? 这需要1.107秒......(w = 1900; h = 1080) 此致

编辑: 我应该注意到我坚持使用1.8.6 ..

3 个答案:

答案 0 :(得分:6)

使用productrepeated_permutation

[1, 2, 3].product([1, 2, 3]) # => [[1, 1], ...
# or
[1, 2, 3].repeated_permutation(2) # => [[1, 1], ...

product在Ruby 1.8.7+中(接受1.9.2+中的块)而在1.9.2+中repeated_permutation。对于其他版本的Ruby,您可以使用包含我的backports gem和include 'backports/1.9.2/array/repeated_permutation'include 'backports/1.8.7/array/product'

答案 1 :(得分:4)

这类似于@nicooga的答案,但我会使用一个范围而不是手动创建数组(即所以你不必为更大的数组键入每个数字)。

range = (1..3).to_a
range.product(range)
#=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]

答案 2 :(得分:3)

有一种更快的方式:

> [1,2,3].product([1,2,3])
=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]