在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?
,send
,respond_to?
等) - 相当容易阅读
- 也适用于哈希(注意
array.to_a
) - 实际上工作(不像只检查第一个分支,和其他愚蠢的东西)