在ruby中获取多维数组的维度

我刚开始学习ruby。 现在我需要弄清楚多维数组的维度。 我查看了所有数组方法的ruby-docs,但我找不到返回维度的方法。

这是一个例子:

对于[[1, 2],[3,4],[5,6]] ,维度应为2。

对于[[[1,2],[2,3]],[[3,4],[5]]] ,维度应为3。

没有内置函数,因为对于数组的“维度”,您可能有多个定义。 Ruby的数组可能包含任何内容,包括哈希或其他数组。 这就是为什么我认为你需要为此实现自己的function。

假设按维度表示“最深的嵌套级别的数组”,这应该可以解决问题:

 def get_dimension a return 0 if a.class != Array result = 1 a.each do |sub_a| if sub_a.class == Array dim = get_dimension(sub_a) result = dim + 1 if dim + 1 > result end end return result end 

编辑:因为ruby是一种很棒的语言,并且允许你做一些花哨的东西,你也可以使get_dimension成为一个Array的方法:

  class Array def get_dimension ... # code from above slightly modified end end 

简单,面向对象的解决方案。

 class Array def depth map {|element| element.depth + 1 }.max end end class Object def depth 0 end end 

在最简单的情况下

 depth = Proc.new do |array| depth = 1 while Array === array.first do array = array.first depth += 1 end depth end array = [[[1,2],[2,3]],[[3,4],[5]]] depth.call(array) #=> 3 

或者这种微小的递归方法

 def depth(array, depth=1) array = array.send(:first) Array === array ? depth(array, depth+1) : depth end array = [[[1,2],[2,3]],[[3,4],[5]]] depth(array) #=> 3 

怎么样:

 class Object def dimension self.class == Array ? 1 + self[0].dimension : 0 end end [[[1,2],[2,3]],[[3,4],[5]]].dimension #=> 3 

作为塔斯方法的修改:

 class Array def depth map{ |element| element.is_a?( Vector ) ? element.depth + 1 : 1 }.max end end 

保持depth作为Array的方法,并且不需要向Object添加方法。

当然,如果您打算调用my_object.depth ,那可能就是您想要的,因为您事先并不知道my_object.class == Array

我对其他解决方案不满意所以我写了一个我实际使用的单线程:

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

它会使arrays1的尺寸变平,直到它不再变平,同时计算尺寸。

为什么这样更好?

  • 不需要修改本机类(如果可能,请避免)
  • 不使用元编程( is_a?sendrespond_to?等)
  • 相当容易阅读
  • 也适用于哈希(注意array.to_a
  • 实际上工作(不像只检查第一个分支,和其他愚蠢的东西)