如何查找数组的所有可能索引

时间:2013-09-19 12:06:36

标签: ruby multidimensional-array

假设我们有一个具有这种形状的数组:[2, 5]。可能的索引组合是:

[
  [0, 0],
  [0, 1],
  [0, 2],
  [0, 3],
  [0, 4],
  [1, 0],
  [1, 1],
  [1, 2],
  [1, 3],
  [1, 4]
]

如果数组具有n维度,是否有一种在Ruby中生成索引的简单方法?

4 个答案:

答案 0 :(得分:5)

这应该有效:

def coordinates(first, *others)
  (0...first).to_a.product(*others.map { |to| (0...to).to_a })
end

coordinates(2, 5)
#=> [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4],
#    [1, 0], [1, 1], [1, 2], [1, 3], [1, 4]]

coordinates(4, 3, 3)
#=> [[0, 0, 0], [0, 0, 1], [0, 0, 2],
#    [0, 1, 0], [0, 1, 1], [0, 1, 2],
#    [0, 2, 0], [0, 2, 1], [0, 2, 2],
#    [1, 0, 0], [1, 0, 1], [1, 0, 2],
#    [1, 1, 0], [1, 1, 1], [1, 1, 2],
#    [1, 2, 0], [1, 2, 1], [1, 2, 2],
#    [2, 0, 0], [2, 0, 1], [2, 0, 2],
#    [2, 1, 0], [2, 1, 1], [2, 1, 2],
#    [2, 2, 0], [2, 2, 1], [2, 2, 2],
#    [3, 0, 0], [3, 0, 1], [3, 0, 2],
#    [3, 1, 0], [3, 1, 1], [3, 1, 2],
#    [3, 2, 0], [3, 2, 1], [3, 2, 2]]

答案 1 :(得分:0)

你走了。它可能不漂亮,但似乎有用。

def gen_indices(dimensions, solutions = [], current=[], level = 0)
  if level < dimensions.length
    dimensions[level].times do |i|
      current << i
      if level == dimensions.length - 1
        solutions << current.clone
      else
        gen_indices(dimensions, solutions, current, level + 1)
      end
      current.pop
    end
  end
  solutions
end

p gen_indices([4,3,2])

答案 2 :(得分:0)

不确定这是完全正确的,但它可以帮助您走上正确的轨道:

def combinations(dimensions)
  dimensions.inject([]){|total, dimension|
    dim = (0...dimension).to_a
    total.empty? ? dim : total.product(dim)
  }.map(&:flatten)
end

p combinations([2, 5]) #=> [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3], [1, 4]]


p combinations([2, 2, 2]) #=> [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

答案 3 :(得分:0)

尝试:

a = [[0,1],[0,1,2,3,4]]
res = a[0].product(a[1])