3

これは私が私の任務で遭遇した私の問題です。

  • 配列Aには、配列Bと配列Cの2つの要素があります。
  • 配列Bには、配列Dと配列Eの2つの要素があります。
  • ある時点で、配列Xには文字列aと文字列bの2つの要素が含まれています。

配列Aの深さを判断する方法がわかりません。例えば:

arrA = [
         [
           [1,2]
         ]
       ]

私はテストしました:A[0][0][0] == nilこれはを返しますfalse。また、A[0][0]..[0] == nil常にを返しますfalse。したがって、この方法で配列Aの深さを知ることはできません。

4

5 に答える 5

9

これがあなたが探しているものではない場合、それは良い出発点になるはずです:

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

> depth(arrA)
=> 3

これは最初のブランチの深さのみを測定することに注意してください。

于 2012-06-02T15:15:51.887 に答える
5

以下に示す私の解決策は、任意の配列の最大深度に答えます。

例:arr = [ [[1]、[2,3]]、[[[ 3,4]]]]の場合、arrの最大深度は3,4の場合は4です。

アプローチ-1レベルずつ平坦化して比較

b, depth = arr.dup, 1

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

それがあなたの質問に答えることを願っています。

于 2012-06-02T15:33:48.810 に答える
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
于 2016-04-10T17:40:38.227 に答える
1

また、使用したい場合は1行のコード

   def depth (a)
        a.to_s.count("[")
    end
于 2021-09-22T06:24:15.440 に答える
0

これは、メソッドに抽出されたkiddorailsのソリューションに似たワンライナーです。

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
  • 実際に機能します(最初のブランチやその他のばかげたものをチェックするだけとは異なります)
于 2017-09-07T15:42:06.820 に答える