How do I find .index of a multidimensional array

后端 未结 7 1652
-上瘾入骨i
-上瘾入骨i 2021-02-08 19:34

Tried web resources and didnt have any luck and my visual quick start guide.

If I have my 2d/multidimensional array:

 array = [[\'x\', \'x\',\' x\',\'x\'         


        
相关标签:
7条回答
  • 2021-02-08 20:09

    Non-Ruby specific answer: You're trying to print 'S' in both examples, but only the latter has 'S' in the array. The first has ['x', 'S', ' ', 'x']. What you will need to do (If Ruby doesn't do this for you) is look at each member in the array and search that member for 'S'. If 'S' is contained in that member then print it.

    0 讨论(0)
  • 2021-02-08 20:10

    You could find first in which is the absolute position by flattening the array:

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

    Then get the number of columns per row:

    ncols = array.first.size
    

    then

    row = pos / ncols
    
    col = pos % ncols
    
    0 讨论(0)
  • 2021-02-08 20:12
    a.each_index { |i| j = a[i].index 'S'; p [i, j] if j }
    

    Update: OK, we can return multiple matches. It's probably best to utilize the core API as much as possible, rather than iterate one by one with interpreted Ruby code, so let's add some short-circuit exits and iterative evals to break the row into pieces. This time it's organized as an instance method on Array, and it returns an array of [row,col] subarrays.

    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 讨论(0)
  • 2021-02-08 20:14
    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 讨论(0)
  • 2021-02-08 20:18

    This will do it:

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

    If you also want 'S's index in the sub array you could:

    row = array.detect{|aa| aa.include?('S')}
    p [row.index('S'), array.index(row)] # prints [1,1]
    
    0 讨论(0)
  • 2021-02-08 20:31

    You can use the method Matrix#index:

    require 'matrix'
    
    Matrix[*array].index("S")
      #=> [1, 1]
    
    0 讨论(0)
提交回复
热议问题