Как посчитать количество массивов в массиве в Ruby? - PullRequest
3 голосов
/ 05 марта 2012

Я не могу найти алгоритм для вычисления количества массивов в массиве.Пример

Дано

[ [ "Array", "1" ], [ "Array", "2" ] ]

Вывод должно быть два

Дано

[
    [
        [ ["Array", "1"], ["Array", "2"] ],
        [ ["Array", "3"], ["Array", "4"] ],
    ],
    [
        [ ["Array", "5"], ["Array", "6"] ],
        [ ["Array", "7"], ["Array", "8"] ]
    ]
]`

Вывод должен быть 8

Ответы [ 3 ]

5 голосов
/ 05 марта 2012

Эта рекурсивная функция выполнит работу для массивов любой вложенности:

def count_subarrays array
  return 0 unless array && array.is_a?(Array)

  nested = array.select { |e| e.is_a?(Array) }
  if nested.empty?
    1 # this is a leaf
  else
    nested.inject(0) { |sum, ary| sum + count_subarrays(ary) }
  end
end
0 голосов
/ 05 марта 2012
class Array
  def deep_array_count()
    count = 0
    each{|el|
      #I could check with is_a?(Array), but with respond_to? you could use your own classes.
      if el.respond_to?(:deep_array_count)            
        count += 1 + el.deep_array_count
      end
    }
    count
  end
end

x = [
   [
     [
      ["Array", "1"], ["Array", "2"] ],
     [ ["Array", "3"], ["Array", "4"] ],
   ],
   [
     [ ["Array", "5"], ["Array", "6"] ],
     [ ["Array", "7"], ["Array", "8"] ]
   ]
  ]

 p x.deep_array_count 

Результат в этом примере - 14, а не запрошенный 8. Я считаю каждый массив.

Чтобы получить 8, вы должны считать только массивы без другого массива.

class Array
  def deep_array_count()
    count = 0
    each{|el|
      #I could check with is_a?(Array), but with respond_to? you could use your own classes.
      if el.respond_to?(:deep_array_count)            
        i = el.deep_array_count
        count += i == 0 ? 1 : i #if no other array is inside, add 1
      end
    }
    count
  end
end

x = [
   [
     [
      ["Array", "1"], ["Array", "2"] ],
     [ ["Array", "3"], ["Array", "4"] ],
   ],
   [
     [ ["Array", "5"], ["Array", "6"] ],
     [ ["Array", "7"], ["Array", "8"] ]
   ]
  ]

 p x.deep_array_count 
0 голосов
/ 05 марта 2012

Я предлагаю вам использовать функцию рекурсии, которая будет возвращать 1, если аргумент является листовым массивом, например: (если в каждом массиве два ребенка, как в упражнении по курсу saas)

 def array?(entity)
    entity[0].kind_of?(Array) ? array?(entity[0]) + array?(entity[1]) : 1
 end
...