【问题标题】:Ruby: how to know depth of multidemensional arrayRuby:如何知道多维数组的深度
【发布时间】:2012-06-07 09:33:33
【问题描述】:

这是我在作业中遇到的问题。

  • 数组 A 有两个元素:数组 B 和数组 C。
  • 数组 B 有两个元素:数组 D 和数组 E
  • 有时,数组 X 只包含两个元素:字符串 a 和字符串 b。

我不知道如何确定数组 A 的深度。例如:

arrA = [
         [
           [1,2]
         ]
       ]

我已经测试过:A[0][0][0] == nil,它返回false。此外,A[0][0]..[0] == nil 总是返回 false。所以,我无法通过这种方式知道数组 A 的深度。

【问题讨论】:

标签: ruby arrays multidimensional-array


【解决方案1】:

如果这不是您想要的,那么它应该是一个很好的起点:

def depth (a)
  return 0 unless a.is_a?(Array)
  return 1 + depth(a[0])
end

> depth(arrA)
=> 3

请注意,这仅测量第一个分支的深度。

【讨论】:

    【解决方案2】:

    我下面的解决方案回答了任何数组的最大深度:

    示例:对于 arr=[ [[1],[2,3]], [[[ 3,4 ]]] ],最大深度对于 3,4,arr 是 4

    Aprroach - 平展一层并进行比较

    b, depth = arr.dup, 1
    
    until b==arr.flatten
      depth+=1
      b=b.flatten(1)
    end
    puts "Array depth: #{depth}" #=> 4
    

    希望它能回答你的问题。

    【讨论】:

      【解决方案3】:

      一个简单的纯函数递归解决方案:

      def depth(xs, n=0)
        return case
        when xs.class != Array
          n
        when xs == []
          n + 1
        else
          xs.collect{|x| depth x, n+1}.max
        end
      end
      

      例子:

      depth([]) == 1
      depth([['a']])) == 2
      depth([1, 2, 3, 4, [1, 2, 3, [[2, 2],[]], 4, 5, 6, 7], 5, 5, [[[[[3, 4]]]]], [[[[[[[[[1, 2]]]]]]]]]]) == 10
      

      【讨论】:

        【解决方案4】:

        这是一个类似于kiddorails' solution的单行提取到方法中:

        def depth(array)
          array.to_a == array.flatten(1) ? 1 : depth(array.flatten(1)) + 1
        end
        

        它会在计算维度的同时将数组 1 维展平,直到它不能再展平。

        为什么这比其他解决方案更好?

        • 不需要修改原生类(如果可能,请避免)
        • 不使用元编程(is_a?sendrespond_to? 等)
        • 相当容易阅读
        • 也适用于哈希(通知array.to_a
        • 确实有效(不像只检查第一个分支和其他愚蠢的东西)

        【讨论】:

          【解决方案5】:

          如果要使用,也可以使用一行代码

             def depth (a)
                  a.to_s.count("[")
              end
          

          【讨论】:

            猜你喜欢
            • 2020-10-16
            • 2016-05-12
            • 2017-07-03
            • 2012-06-26
            • 2021-01-13
            • 2015-06-30
            • 1970-01-01
            • 1970-01-01
            • 2020-01-12
            相关资源
            最近更新 更多