Ruby:如何知道多维数组的深度

3

这是我在任务中遇到的问题。

  • 数组A有两个元素:数组B和数组C。
  • 数组B有两个元素:数组D和数组E。
  • 在某个时刻,数组X只包含两个元素:字符串a和字符串b。

我不知道如何确定数组A的深度。例如:

arrA = [
         [
           [1,2]
         ]
       ]

我已经测试过:A[0][0][0] == nil,返回的结果是false。此外,A[0][0]..[0] == nil 总是返回false。所以,我不能通过这种方式知道数组A有多深。


看这个:https://dev59.com/PWHVa4cB1Zd3GeqPjh-9 - Flexoid
1
你能提供一个更好的例子吗?arrA看起来和你描述的完全不一样。 - tokland
2
你不能只是递归地检查数组类型,同时它仍然是一个数组就继续这样做吗? - Dave Newton
请将作业问题标记为作业。 - Mark Reed
可能是在Ruby中获取多维数组的维度的重复问题。 - thisismydesign
5个回答

9

如果这不是您想要的内容,这应该是一个很好的起点:

def depth (a)
  return 0 unless a.is_a?(Array)
  return 1 + depth(a[0])
end

> depth(arrA)
=> 3

请注意,这只测量第一个分支的深度。

5

我的解决方案如下,它可以找到任何数组的最大深度:

例如:对于arr = [ [[1],[2,3]], [[[ 3,4]]] ],arr的最大深度是 4 ,因为数字3,4处在第四层。

方法- 将数组扁平化一级并进行比较

b, depth = arr.dup, 1

until b==arr.flatten
  depth+=1
  b=b.flatten(1)
end
puts "Array depth: #{depth}" #=> 4

希望这能回答你的问题。

2

一个简单的纯函数式递归解决方案:

def depth(xs, n=0)
  return case
  when xs.class != Array
    n
  when xs == []
    n + 1
  else
    xs.collect{|x| depth x, n+1}.max
  end
end

示例:

depth([]) == 1
depth([['a']])) == 2
depth([1, 2, 3, 4, [1, 2, 3, [[2, 2],[]], 4, 5, 6, 7], 5, 5, [[[[[3, 4]]]]], [[[[[[[[[1, 2]]]]]]]]]]) == 10

0

以下是一个类似于kiddorails' solution的一行代码,已提取为方法:

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

它会将数组逐层展平,直到无法再展平为止,同时计算维度。

为什么这比其他解决方案更好?

  • 不需要修改本地类(尽可能避免)
  • 不使用元编程(is_a?sendrespond_to?等)
  • 相当容易阅读
  • 也适用于哈希表(注意array.to_a
  • 实际上有效(不像只检查第一个分支和其他愚蠢的东西)

0

如果您想使用,还有一行代码

   def depth (a)
        a.to_s.count("[")
    end

这种情况下它不起作用:[[1],[2],[3]] - Rafik Farhad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接