2012-03-03 33 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
  • 实际工作(不像只检查第一分公司等愚蠢的东西)