2009-12-05 49 views
8

试过网页资源,没有任何运气和我的视觉快速入门指南。如何找到多维数组的索引

如果我有我的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') 

返回我要找1

我第一次的猜测值.index()中有些东西被称为错误,并且它需要两个参数,一个用于行和列?反正我怎么让.index工作的多维数组?这是解决我的小迷宫问题的第一步

+0

有一件事我没有看到(几个很不错的)答案中提到的是,红宝石真的不支持二维数组 - 他们真的数组的数组,因此是两级搜索。 – 2009-12-05 12:57:58

回答

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

更新:好的,我们可以ret瓮多个比赛。尽可能多地利用核心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' 
+0

可能会问很多我将如何处理数组中的多个值?比如我运行它时的'x',它返回第一列的值而不是所有的列。试了几件事,仍然没有运气。建议? – Matt 2009-12-05 03:29:08

+0

当然,我可以在一分钟内发布更新。 (我想知道为什么它有一个驱动器downvote?没什么大不了的,只是好奇......) – DigitalRoss 2009-12-05 04:18:55

0

非Ruby特定答案:您试图在两个示例中都打印'S',但只有后者在数组中有'S'。第一个有['x','S','','x']。你需要做的事情(如果Ruby不这样做)查看数组中的每个成员并搜索该成员的'S'。如果该成员中包含“S”,则打印出来。

4

你可以找到一个在哪些是被压扁阵列的绝对位置:

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

然后得到每行的列数:

ncols = array.first.size 

然后

row = pos/ncols 

col = pos % ncols 
+0

你可以用'row,col = pos.divmod(ncols)'替换最后两行。 – 2016-12-09 00:34:50

12

这将做到这一点:

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

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

如果你也想作者:的子阵列你可以在指数:

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

它打印出哪一行(即嵌套数组),而不是它在子数组中的位置。这个问题并不完全清楚(尽管第二个答案会打印两者)。 – samg 2009-12-05 02:22:44

+0

ultimatly希望得到两个indicies,所以我可以包括在后面的if语句 – Matt 2009-12-05 03:01:27

+0

非常有帮助!感谢你! – shedd 2010-10-05 14:25:42

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 
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 
3

您可以使用该方法Matrix#index

require 'matrix' 

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

这应该是被接受的答案。它混淆了很多复杂性,但它优雅而简单。 – ACIDSTEALTH 2016-12-09 00:17:55

+0

谢谢@Cary Swoveland这真的帮了我一个复杂的电子表格问题,我试图解决。我从不知道Ruby有一个Matrix类 – 2017-03-03 17:14:38