Create two-dimensional arrays and access sub-arrays in Ruby

前端 未结 9 874
走了就别回头了
走了就别回头了 2020-11-28 03:26

I wonder if there\'s a possibility to create a two dimensional array and to quickly access any horizontal or vertical sub array in it?

I believe we can access a hor

相关标签:
9条回答
  • 2020-11-28 03:49

    Here's a 3D array case

    class Array3D
       def initialize(d1,d2,d3)
        @data = Array.new(d1) { Array.new(d2) { Array.new(d3) } }
       end
    
      def [](x, y, z)
        @data[x][y][z]
      end
    
      def []=(x, y, z, value)
        @data[x][y][z] = value
      end
    end
    

    You can access subsections of each array just like any other Ruby array. @data[0..2][3..5][8..10] = 0 etc

    0 讨论(0)
  • 2020-11-28 03:52

    x.transpose[6][3..8] or x[3..8].map {|r| r [6]} would give what you want.

    Example:

    a = [ [1,  2,  3,  4,  5],
          [6,  7,  8,  9,  10],
          [11, 12, 13, 14, 15],
          [21, 22, 23, 24, 25]
        ]
    
    #a[1..2][2]  -> [8,13]
    puts a.transpose[2][1..2].inspect   # [8,13]
    puts a[1..2].map {|r| r[2]}.inspect  # [8,13]
    
    0 讨论(0)
  • 2020-11-28 03:55

    Here is an easy way to create a "2D" array.

    2.1.1 :004 > m=Array.new(3,Array.new(3,true))
    
    => [[true, true, true], [true, true, true], [true, true, true]]
    
    0 讨论(0)
  • 2020-11-28 03:57

    Here is the simple version

     #one
     a = [[0]*10]*10
    
     #two
    row, col = 10, 10
    a = [[0]*row]*col
    
    0 讨论(0)
  • 2020-11-28 04:04

    There are some problems with 2 dimensional Arrays the way you implement them.

    a= [[1,2],[3,4]]
    a[0][2]= 5 # works
    a[2][0]= 6 # error
    

    Hash as Array

    I prefer to use Hashes for multi dimensional Arrays

    a= Hash.new
    a[[1,2]]= 23
    a[[5,6]]= 42
    

    This has the advantage, that you don't have to manually create columns or rows. Inserting into hashes is almost O(1), so there is no drawback here, as long as your Hash does not become too big.

    You can even set a default value for all not specified elements

    a= Hash.new(0)
    

    So now about how to get subarrays

    (3..5).to_a.product([2]).collect { |index| a[index] }
    [2].product((3..5).to_a).collect { |index| a[index] }
    

    (a..b).to_a runs in O(n). Retrieving an element from an Hash is almost O(1), so the collect runs in almost O(n). There is no way to make it faster than O(n), as copying n elements always is O(n).

    Hashes can have problems when they are getting too big. So I would think twice about implementing a multidimensional Array like this, if I knew my amount of data is getting big.

    0 讨论(0)
  • 2020-11-28 04:05
    rows, cols = x,y  # your values
    grid = Array.new(rows) { Array.new(cols) }
    

    As for accessing elements, this article is pretty good for step by step way to encapsulate an array in the way you want:

    How to ruby array

    0 讨论(0)
提交回复
热议问题