2012-03-03 77 views
6

我剛開始學習ruby。 現在我需要弄清楚多維數組的維數。我查看了所有數組方法的ruby-docs,但找不到可返回維度的方法。在ruby中獲得多維數組的維數

下面是一個例子:

對於[[1, 2],[3,4],[5,6]]尺寸應該爲2

對於[[[1,2],[2,3]],[[3,4],[5]]],尺寸應爲3

回答

2

沒有內置函數,因爲可能存在多個定義,以表示數組的「維度」。 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 
+0

如果sub_a.class == Array – Short 2013-07-04 00:09:32

1

在最簡單的情況

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 
+0

爲什麼PROC,不正規功能? – 2012-03-03 11:34:55

+0

我不確定,doc%)這是行爲驅動的東西。我在控制檯,我通常在控制檯中使用特效。當然,它可以改寫爲通常的方法 – fl00r 2012-03-03 11:39:45

+0

我只是好奇,這就是全部:) – 2012-03-03 11:41:48

0

如何:

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

再次在a = [3,[1,2]]的情況下不起作用。輸出將是1而不是2.稍作修改將使其適用於這種情況。 – 2012-03-03 12:23:39

+0

@izomorphius - 在我看來,在這種情況下,1是正確的值。你說得對,這個問題並沒有說清楚。 – pguardiario 2012-03-03 13:03:32

6

小號面向對象的解決方案。

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

class Object 
    def depth 
    0 
    end 
end 
0

作爲塔斯的方法的變形例:

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

0

我是不滿意的其他解決方案,所以我寫了一個班輪我實際上使用:

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

它將在此時壓扁陣列1的尺寸,直到它不能再變平,同時計算尺寸。

爲什麼這更好?

  • 不需要修改到本地類(避免如果可能的話)
  • 不使用元編程(is_a?sendrespond_to?等)
  • 相當容易閱讀
  • 作品與哈希以及(注意array.to_a
  • 實際工作(不像只檢查第一分公司等愚蠢的東西)