我刚开始学习 Ruby。
现在我需要弄清楚多维数组的维数。我查看了 Ruby 文档中的所有数组方法,但找不到返回维数的方法。
这是一个示例:
这是一个示例:
[[1, 2],[3,4],[5,6]]
的维数应该是 2。
[[[1,2],[2,3]],[[3,4],[5]]]
的维数应该是 3。class Array
def depth
map {|element| element.depth + 1 }.max
end
end
class Object
def depth
0
end
end
由于Ruby的数组可以包含任何东西,包括哈希或其他数组,因此没有内置函数可以解决“维度”的定义问题。所以我认为你需要自己实现这个功能。
如果您的“维度”指的是“最深嵌套级别的数组”,那么可以使用以下代码:
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
class Array
def get_dimension
... # code from above slightly modified
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
我对其他解决方案不满意,所以我写了一个我实际会使用的一行代码:
def depth(array)
array.to_a == array.flatten(1) ? 1 : depth(array.flatten(1)) + 1
end
它将逐层压缩数组,直到无法再压缩为止,同时计算维度。
为什么这样更好呢?
is_a?
、send
、respond_to?
等)array.to_a
)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
,那么这可能是您想要的。