2009-12-05 43 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