我如何找到多维数组的.index

时间:2009-12-05 01:29:19

标签: ruby

尝试过网络资源,并没有任何运气和我的视觉快速入门指南。

如果我有2d /多维数组:

 array = [['x', 'x',' x','x'],
         ['x', 'S',' ','x'],
         ['x', 'x',' x','x']]

   print array.index('S')

   it returns nil

然后我去输入:

 array = ['x', 'S',' ','x']
 print array.index('S')

它返回我正在寻找的值

我的第一个猜测是在.index()中调用了一些错误,它需要两个参数,一个用于行和列?无论如何我如何使.index为多维数组工作?这是解决我的小迷宫问题的第一步

7 个答案:

答案 0 :(得分:12)

这样做:

array = [['x', 'x',' x','x'],
         ['x', 'S',' ','x'],
         ['x', 'x',' x','x']]

p array.index(array.detect{|aa| aa.include?('S')}) # prints 1

如果您还想要子阵列中的'S索引,您可以:

row = array.detect{|aa| aa.include?('S')}
p [row.index('S'), array.index(row)] # prints [1,1]

答案 1 :(得分:5)

您可以使用方法Matrix#index

require 'matrix'

Matrix[*array].index("S")
  #=> [1, 1]

答案 2 :(得分:4)

你可以通过展平数组找到第一个绝对位置:

pos = array.flatten.index('S')

然后获取每行的列数:

ncols = array.first.size

然后

row = pos / ncols

col = pos % ncols

答案 3 :(得分:4)

a.each_index { |i| j = a[i].index 'S'; p [i, j] if j }

更新:好的,我们可以返回多个匹配项。最好尽可能多地利用核心API,而不是使用解释的Ruby代码逐个迭代,所以让我们添加一些短路退出和迭代演绎来将行分成几部分。这次它被组织为Array上的实例方法,它返回一个[row,col]子数组的数组。

a = [ %w{ a b c d },
      %w{ S },
      %w{ S S S x y z },
      %w{ S S S S S S },
      %w{ x y z S },
      %w{ x y S a b },
      %w{ x },
      %w{ } ]

class Array
  def locate2d test
    r = []
    each_index do |i|
      row, j0 = self[i], 0
      while row.include? test
        if j = (row.index test)
          r << [i, j0 + j]
          j  += 1
          j0 += j
          row = row.drop j
        end
      end
    end
    r
  end
end

p a.locate2d 'S'

答案 4 :(得分:0)

非Ruby特定答案:你试图在两个例子中打印'S',但只有后者在数组中有'S'。第一个有['x','S','','x']。您需要做什么(如果Ruby不为您执行此操作),请查看数组中的每个成员并搜索该成员的“S”。如果该成员中包含“S”,则将其打印出来。

答案 5 :(得分:0)

array = [['x', 'x',' x','x'],
         ['x', 'S',' ','x'],
         ['x', 'x',' x','x']]
class Array
  def my_index item
    self.each_with_index{|raw, i| return i if raw.include? item}
    return
  end
end

p array.my_index("S") #=>1
p array.my_index("Not Exist Item") #=> nil

答案 6 :(得分:0)

指定子数组中一次传递的第一个元素的索引

a = [[...],[...],[...],[...]]
element = 'S'
result_i = result_j = nil

a.each_with_index do|row, i|
    if (j = row.index(element))
        result_i, result_j = i, j       
        break
    end
end