我刚开始学习ruby。 现在我需要弄清楚多维数组的维数。我查看了所有数组方法的ruby-docs,但找不到可返回维度的方法。在ruby中获得多维数组的维数
下面是一个例子:
对于[[1, 2],[3,4],[5,6]]
尺寸应该为2
对于[[[1,2],[2,3]],[[3,4],[5]]]
,尺寸应为3
我刚开始学习ruby。 现在我需要弄清楚多维数组的维数。我查看了所有数组方法的ruby-docs,但找不到可返回维度的方法。在ruby中获得多维数组的维数
下面是一个例子:
对于[[1, 2],[3,4],[5,6]]
尺寸应该为2
对于[[[1,2],[2,3]],[[3,4],[5]]]
,尺寸应为3
没有内置函数,因为可能存在多个定义,以表示数组的“维度”。 Ruby的数组可能包含任何东西,包括散列或其他数组。这就是为什么我相信你需要为此实现你自己的功能。
Asuming通过维你的意思是“数组的嵌套最深层次”这应该做的伎俩:
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
编辑:和红宝石是一种伟大的语言,并允许你做一些花哨的东西,你可以也使get_dimension阵列的方法:
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
为什么PROC,不正规功能? – 2012-03-03 11:34:55
我不确定,doc%)这是行为驱动的东西。我在控制台,我通常在控制台中使用特效。当然,它可以改写为通常的方法 – fl00r 2012-03-03 11:39:45
我只是好奇,这就是全部:) – 2012-03-03 11:41:48
如何:
class Object
def dimension
self.class == Array ? 1 + self[0].dimension : 0
end
end
[[[1,2],[2,3]],[[3,4],[5]]].dimension
#=> 3
再次在a = [3,[1,2]]的情况下不起作用。输出将是1而不是2.稍作修改将使其适用于这种情况。 – 2012-03-03 12:23:39
@izomorphius - 在我看来,在这种情况下,1是正确的值。你说得对,这个问题并没有说清楚。 – pguardiario 2012-03-03 13:03:32
小号面向对象的解决方案。
class Array
def depth
map {|element| element.depth + 1 }.max
end
end
class Object
def depth
0
end
end
作为塔斯的方法的变形例:
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
它将在此时压扁阵列1的尺寸,直到它不能再变平,同时计算尺寸。
为什么这更好?
is_a?
,send
,respond_to?
等)array.to_a
)
如果sub_a.class == Array – Short 2013-07-04 00:09:32