4

我正在寻找一种创建数组的方法,例如:

[[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 ..

4

3 回答 3

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+ 中接受块),而repeated_permutation在 1.9.2+ 中。对于其他版本的 Ruby,您可以使用 include my backportsgem 和include 'backports/1.9.2/array/repeated_permutation'or include 'backports/1.8.7/array/product'

于 2013-01-30T20:37:08.083 回答
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]]
于 2013-01-30T20:13:43.113 回答
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]]
于 2013-01-30T20:09:05.407 回答