尝试过网络资源,并没有任何运气和我的视觉快速入门指南。
如果我有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为多维数组工作?这是解决我的小迷宫问题的第一步
答案 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