通过多维数组进行迭代



我只是想知道是否有其他好的方法来解决这样的问题:

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类添加新方法,而是学习解决上述问题的新方法。

我会尝试使它更符合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

Update: Version without patch core Array:

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

相关内容

  • 没有找到相关文章

最新更新