Ruby通过多维数组迭代

时间:2015-07-08 18:31:37

标签: arrays ruby recursion multidimensional-array

我只想知道是否还有其他好方法可以解决以下问题:

p   [1,[2,3,"hi",[[[[2,"ex","bye"]]]]]].count_type(String)
# => 3

所以我们的目标是计算多维数组中的类型,但正如我所说,这样的问题,而不仅仅是这个问题。一般问题是我们得到多维数组,然后我们需要搜索最小索引为2或其他条件的类型或数组。我很抱歉我的语言使用不好,希望你明白这一点。

我知道递归方法有效。但是递归或非递归实现还有其他方法吗?

我使用以下内容:

  def count_type(type)
    counter = 0

    self.each { |elem|
      if elem.is_a?(type)
        counter +=1
      end

      if elem.is_a?(Array)
        counter += elem.method(type)
      end
    }
  end

  return counter

我知道elem.is_a?(type)的部分有所不同,取决于你要求的是什么。 我忘了告诉你,禁止使用flatten,我的目标不是在类Array中添加新方法,而是学习解决上述问题的新方法。

1 个答案:

答案 0 :(得分:0)

我尝试使用Ruby核心函数更加符合风格,特别是如果您打算将它添加到Array中:

class Array
  def deep_count(*args, &block)
    count = self.count(*args, &block)

    each do |e|
      count += e.deep_count(*args, &block) if e.is_a?(Array)
    end

    count
  end
end

[1,[2,3,"hi",[[[[2,"ex","bye"]]]]]].deep_count {|v| v.is_a?(String)}
# => 3

[1,[2,3,"hi",[[[[2,"ex","bye"]]]]]].deep_count(2)
# => 2

更新版本没有修补核心数组:

def array_deep_count(array, *args, &block)
  count = array.count(*args, &block)

  array.each do |e|
    count += e.deep_count(*args, &block) if e.is_a?(Array)
  end

  count
end

这主要涉及用self交换参数。