Ruby:如何知道多维数组的深度

时间:2012-06-02 12:08:14

标签: ruby arrays multidimensional-array

这是我在任务中遇到的问题。

  • 数组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的深度。

3 个答案:

答案 0 :(得分:9)

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

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

> depth(arrA)
=> 3

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

答案 1 :(得分:5)

我的解决方案在下面回答了任何阵列的最大深度:

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

Aprroach - 压平一级并进行比较

b, depth = arr.dup, 1

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

希望它能回答你的问题。

答案 2 :(得分:0)

这里有一个类似于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
  • 实际上有效(不像只检查第一个分支和其他愚蠢的东西)