我剛開始學習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